【问题标题】:post json request in swift快速发布 json 请求
【发布时间】:2015-08-25 10:45:08
【问题描述】:

我知道如何发布简单的 json:

 // Compose a query string
 let postString = “firstName=James&lastName=Bond”;
 request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

现在服务器端需要json格式,如:

{ 
"name": "testuser123", 
"pass": "testuser123", 
"field_shouji": 
  { "und": 
    [{ 
      "value": "15652344931" 
    }] 
  }
}

并且内容类型应该是:application/json。 google了一整天,还是能找到正确的方法。

【问题讨论】:

    标签: swift swifty-json


    【解决方案1】:

    您需要发送有效格式的 JSON。
    “firstName=James&lastName=Bond”; 不是 JSON 格式。

    斯威夫特 4

    自从 Swift 3 和 4 Apple 开始删除 NS* 的东西(即使其中许多只是 NS* 的别名),我们将使用更多的 Swift 方式

    //Method just to execute request, assuming the response type is string (and not file)
    func HTTPsendRequest(request: URLRequest,
                         callback: @escaping (Error?, String?) -> Void) {
        let task = URLSession.shared.dataTask(with: request) { (data, res, err) in
            if (err != nil) {
                callback(err,nil)
            } else {
                callback(nil, String(data: data!, encoding: String.Encoding.utf8))
            }
        }
        task.resume()
    }
    
    // post JSON
    func HTTPPostJSON(url: String,  data: Data,
                      callback: @escaping (Error?, String?) -> Void) {
        
        var request = URLRequest(url: URL(string: url)!)
        
        request.httpMethod = "POST"
        request.addValue("application/json",forHTTPHeaderField: "Content-Type")
        request.addValue("application/json",forHTTPHeaderField: "Accept")
        request.httpBody = data
        HTTPsendRequest(request: request, callback: callback)
    }
    

    使用示例

    var dict = Dictionary<String, Any>()
    
    dict["username"] = "hello"
    dict["password"] = "swift"
    let data = try JSONSerialization.data(withJSONObject: dict, options: [])
    
    HTTPPostJSON(url: "http://example.com/login", data: data) { (err, result) in
        if(err != nil){
            print(err!.localizedDescription)
            return
        }
        print(result ?? "")
    }
    

    斯威夫特
    func HTTPsendRequest(request: NSMutableURLRequest,
        callback: (String, String?) -> Void) {
            let task = NSURLSession.sharedSession()
                .dataTaskWithRequest(request) {
                    (data, response, error) -> Void in
                    if (error != nil) {
                        callback("", error.localizedDescription)
                    } else {
                        callback(NSString(data: data,
                            encoding: NSUTF8StringEncoding)! as String, nil)
                    }
            }
            
            task.resume()
    }
    
    func HTTPPostJSON(url: String,  data: NSData,
        callback: (String, String?) -> Void) {
            
            var request = NSMutableURLRequest(URL: NSURL(string: url)!)
            
            request.HTTPMethod = "POST"
            request.addValue("application/json",forHTTPHeaderField: "Content-Type")
            request.addValue("application/json",forHTTPHeaderField: "Accept")
            request.HTTPBody = data
            HTTPsendRequest(request, callback: callback)
    }
    

    使用示例

    我们将设置 NSMutableDictionary 并将其转换为 JSON

    var json = NSMutableDictionary()
    json.setValue("testuser123", forKey: "name"); //set all your values..
    
    let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions(0), error: nil);
    HTTPPostJSON("http;..", data:data!) { (response, error) -> Void in
        println(response);
    }
    

    【讨论】:

      【解决方案2】:

      在上述答案中,应将代码行更改如下

      var json = NSDictionary() 代码应更改为 let json = NSMutableDictionary()

      因为 NSDictionary() 是不可变的,而 NSMutableDictionary() 是可变的

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2018-05-07
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        相关资源
        最近更新 更多