【问题标题】:Swift 2 JSON POST request [dictionary vs. String for HTTPBody of NSMutableURLRequest]Swift 2 JSON POST 请求 [NSMutableURLRequest 的 HTTPBody 的字典与字符串]
【发布时间】:2016-04-18 21:53:55
【问题描述】:

我有以下快速代码可以成功提交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'
  }
});

【问题讨论】:

  • x-www-form-urlencoded vs application/json。您尚未将 Content-Type 标头字段设置为 application/json。
  • Omfg,我实际上花了三个小时试图弄清楚这个问题......一种方法不起作用,那是因为我也忽略了这个...... -_-

标签: ios swift macos swift2 nsurlsession


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我试过了,但没有任何改变。如果我查看 JS 示例中的请求,它也是 x-www-form-urlencoded,所以如果您不指定内容类型,jquery 可能正在从 js 对象到 UTF8 字符串编码的文本进行一些转换......我的服务器可能没有完全接受json...我会回来报告的。
  • 是的,就是这样,我查看了请求的错误部分。谢谢大家!
【解决方案2】:

对于“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)

这将获取您的字典,将其转换为符合您请求的内容类型的字符串(通过使用分隔符加入字典),然后使用 utf8 对其进行编码。

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多