Swift 2 JSON POST请求[字典与NSMutableURLRequest的HTTPBody的字符串]

时间:2016-04-18 21:53:56

标签: ios swift macos swift2 nsurlsession

我有以下快速代码成功提交POST请求。

let request = NSMutableURLRequest(URL: NSURL(string: url)!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
request.HTTPBody = "foo=bar&baz=lee".dataUsingEncoding(NSUTF8StringEncoding)

let task = session.dataTaskWithRequest(request, completionHandler: completionHandler)

我不想使用类似语法的查询参数,而是想使用字典,但是当我执行以下操作时:

let request = NSMutableURLRequest(URL: NSURL(string: url)!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(["foo":"bar", "lee":"baz"], options: [])

let task = session.dataTaskWithRequest(request, completionHandler: completionHandler)

(就像我在周围看到的那样),它似乎提交了请求,好像身体是空的。

我的主要问题是:这些语法有何不同,结果请求有何不同?

注意:来自JS,我正在javascript环境(jquery.com的控制台)中测试端点,如下所示,并且它正在成功运行:

$.ajax({
  url: url,
  method: 'POST',
  data: {
    foo: 'bar',
    baz: 'lee'
  }
});

2 个答案:

答案 0 :(得分:1)

@mrkbxt说的是什么。这不是语法如何不同的问题,而是与您的请求一起发送的不同数据类型的问题。 UTF8字符串编码文本是NSMutableURLRequest内容类型的默认值,这就是您的第一个请求有效的原因。要在正文中使用JSON,您必须切换内容类型以使用JSON。

将以下内容添加到您的请求对象中,以便它接受JSON:

request.setValue("application/json", forHTTPHeaderField: "Content-Type")

答案 1 :(得分:0)

对于类型为“ x-www-form-urlencoded”的内容类型,您可以执行以下操作。

 let bodyParameter = ["foo":"bar", "lee":"baz"]
 let bodyString = bodyData.map { "\($0)=\($1)" }.joined(separator: "&")
 let encodedData = NSMutableData(data: bodyString.data(using: String.Encoding.utf8)!)
 let request = NSMutableURLRequest(URL: NSURL(string: url)!)
 let session = NSURLSession.sharedSession()
 request.HTTPMethod = "POST"
 request.HTTPBody
 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
 let task = session.dataTaskWithRequest(request, completionHandler: completionHandler)

这将带您的字典,将其转换为符合您请求的content-Type的字符串(通过使用分隔符加入字典),然后使用utf8对其进行编码。