为 swift 添加 POST,PUT,DELETE 请求 class

Add POST,PUT,DELETE request class for swift

我已经创建了一个客户端服务 class 来从 Web api 发出调用 GET 请求。我尝试扩展但有更多的网络方法 POSTPUTDelete。我没有找到如何使用 [= 创建 POST、PUT、Delete 的好例子25=] closure.I 就想问问如何添加POST,PUT,Delete到客户端?

import Foundation

class ClientService{

    func getClients(searchstring:String,pageNumber:Int,callBack:(NSArray)->()){
        request("\(_settings.baseUrl)Client/\(searchstring)/\(String(pageNumber))/rrn/brns", callBack: callBack)
    }

    func request(url:String,callBack:(NSArray)->()){
        let nsURL = NSURL(string:url);
        let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!){
            (data,response,error) in
            do {
                let response = try NSJSONSerialization.JSONObjectWithData(data!, options:  NSJSONReadingOptions.MutableContainers) as! NSArray
                callBack(response)
            } catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }
        }
        task.resume()
    }

    init(){
        self._settings = Settings();
    }

    var _settings:Settings!;
}

我在 mes 项目中使用 Alamofire(Swift 中的优雅 HTTP 网络),我喜欢它

所以示例如何使用 POST

let parameters = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3

以及如何使用删除

Alamofire.request(.DELETE, "https://httpbin.org/delete") 

转到文档非常好 https://github.com/Alamofire/Alamofire 如果你想在没有框架的情况下使用 swift

这是如何使用的示例 POST

 var request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:4567/login"))
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    var params = ["username":"jameson", "password":"password"] as Dictionary<String, String>

    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary

        // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
        if(err != nil) {
            println(err!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
        }
        else {
            // The JSONObjectWithData constructor didn't return an error. But, we should still
            // check and make sure that json has a value using optional binding.
            if let parseJSON = json {
                // Okay, the parsedJSON is here, let's get the value for 'success' out of it
                var success = parseJSON["success"] as? Int
                println("Succes: \(success)")
            }
            else {
                // Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                println("Error could not parse JSON: \(jsonStr)")
            }
        }
    })

    task.resume()

您可以像这样创建一个 HTTP 请求,而不是使用 dataTaskWithUrl

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = jsonData
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue(String (jsonData?.length), forHTTPHeaderField: "Content-Length")

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request)  { data, res, error in
      // etc etc

上面示例中的其他所有内容都是相同的。当然,您必须提供 json 数据。为此,您可以这样做:

    let data: [String: AnyObject] = ["nameValue": dataValue]
    var jsonData: NSData? = nil
    do {
        jsonData = try NSJSONSerialization.dataWithJSONObject(data, options: NSJSONWritingOptions(rawValue: 0))
    } catch {
        // some error serializing
    }

你走在正确的轨道上。我为 get、post、put、delete 等创建了一个单独的函数。但是如果你愿意,你可以将它们放在一个函数中。

请记住,这段代码只是为了说明如何操作。您需要根据需要对其进行修改。

func request(url:String, method: String, params: [String: String], completion: ([AnyObject])->() ){
    if let nsURL = NSURL(string:url) {
        let request = NSMutableURLRequest(URL: nsURL)
        if method == "POST" {
            // convert key, value pairs into param string
            postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
            request.HTTPMethod = "POST"
            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)            
        }
        else if method == "GET" {
            postString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
            request.HTTPMethod = "GET"
        }
        else if method == "PUT" {
            putString = params.map { "\([=10=].0)=\([=10=].1)" }.joinWithSeparator("&")
            request.HTTPMethod = "PUT"
            request.HTTPBody = putString.dataUsingEncoding(NSUTF8StringEncoding)                        
        }
        // Add other verbs here

        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            (data, response, error) in
            do {

                // what happens if error is not nil? 
                // That means something went wrong.

                // Make sure there really is some data
                if let data = data {
                    let response = try NSJSONSerialization.JSONObjectWithData(data, options:  NSJSONReadingOptions.MutableContainers) 
                    completion(response)                    
                }
                else {
                    // Data is nil.
                }
            } catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }
        }
        task.resume()            
    }
    else{
        // Could not make url. Is the url bad?
        // You could call the completion handler (callback) here with some value indicating an error
    }    
}

这样称呼它:

request("http://somedomain.etc", "POST", ["key1" : "value1", "key2", "values2"]) { 
    (result) in 
    // Handle result here.
}

你会注意到我去掉了 NSArray。 [AnyObject] 是执行此操作的 Swift 方法。

我建议您在完成处理程序中添加某种错误指示器。这会让您检测到出现问题并进行处理。

使用时要非常小心!展开变量。这是应用程序崩溃的最常见原因。

Swift 4个版本(我认为):

func restRequest(url:String, method: String, params: [String: String], completion: @escaping ([AnyObject])->() ){
    if let nsURL = NSURL(string:url) {
        let request = NSMutableURLRequest(url: nsURL as URL)
        if method == "POST" {
            // convert key, value pairs into param string
            let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
            request.httpMethod = "POST"
            request.httpBody = postString.data(using: String.Encoding.utf8)
        }
        else if method == "GET" {
            let postString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
            request.httpMethod = "GET"
        }
        else if method == "PUT" {
            let putString = params.map { "\([=10=].0)=\([=10=].1)" }.joined(separator: "&")
            request.httpMethod = "PUT"
            request.httpBody = putString.data(using: String.Encoding.utf8)
        }
        // Add other verbs here

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            (data, response, error) in
            do {

                // what happens if error is not nil?
                // That means something went wrong.

                // Make sure there really is some data
                if let data = data {
                    let response = try JSONSerialization.JSONObjectWithData(data, options:  JSONSerialization.ReadingOptions.MutableContainers)
                    completion(response)
                }
                else {
                    // Data is nil.
                }
            } catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }
        }
        task.resume()
    }
    else{
        // Could not make url. Is the url bad?
        // You could call the completion handler (callback) here with some value indicating an error
    }
}