快速发布 json 请求

Posted

技术标签:

【中文标题】快速发布 json 请求【英文标题】:post json request in swift 【发布时间】: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了一整天,还是能找到正确的方法。

【问题讨论】:

【参考方案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() 是可变的

【讨论】:

以上是关于快速发布 json 请求的主要内容,如果未能解决你的问题,请参考以下文章

快速解析时无法在json post请求参数中添加文本字段输入的文本

python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)

python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)

Express API JSON 和 XML POST 请求

快速检查 HTTP Post 请求

如何进行快速的 http 请求? (爪哇)