swift2 Swift 2 JSON POST请求[NSMutableURLRequest的HTTP正文的字典与字符串]

yruzcnhs  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(235)

我有下面的swift代码,它成功地提交了一个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)

(like我在周围看到的),它似乎提交请求,就好像主体是空的一样。
我的主要问题是:这些语法有何不同,产生的请求又有何不同?

  • 注意 *:来自JS,我正在javascript环境(jquery.com的控制台)中测试端点,如下所示,它工作正常:
$.ajax({
  url: url,
  method: 'POST',
  data: {
    foo: 'bar',
    baz: 'lee'
  }
});
20jt8wwn

20jt8wwn1#

@mrkbxt说的是什么。这不是语法如何不同的问题,而是随请求发送的数据类型不同的问题。UTF8字符串编码文本是NSMutableURLRequest内容类型的默认值,这就是为什么您的第一个请求可以工作。要在正文中使用JSON,您必须将内容类型切换为使用JSON。
将以下内容添加到请求对象中,使其接受JSON:

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

rta7y2nd2#

对于类型为“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对其进行编码。

相关问题