为什么我的http POST主体的一个版本不起作用?

时间:2017-02-12 16:25:42

标签: ios json swift post

我正在尝试使用POST向API发送内容。柱体由x 2个属性组成。

如果我将帖子主体创建为一个长字符串: let postBody = "ministryId=nameOfMinistryHere&personId=1005"然后对字符串进行编码,如下所示urlRequest.httpBody = postBody.data(using: String.Encoding.utf8)它完美无缺。

但我正在尝试将帖子创建为字典,然后将其传递给API,但无法使其发挥作用。

let postBody = ["ministryId":"nameOfMinistry", "personId":"1005"]
    do {
      try urlRequest.httpBody = JSONSerialization.data(withJSONObject: postBody, options: .prettyPrinted)
       } catch {
           print("problems serializing data")
       }

当我使用后一个选项时,我从服务器收到400错误。

我错过了什么?

提前致谢。

3 个答案:

答案 0 :(得分:1)

URLComponents是处理多个参数的类。代码段:

let postBody = ["ministryId":"nameOfMinistry", "personId":"1005"]

let urlComponents = URLComponents(string: myURL)
let urlRequest = URLRequest(url: urlComponents.url!)

// transform the dictionary into queryItems
urlComponents.queryItems = postBody.map { URLQueryItem(name: $0, value: $1) }

urlRequest.httpBody = urlComponents.percentEncodedQuery?.data(using: String.Encoding.utf8)

答案 1 :(得分:1)

thecloud_of_unKnowing 回答你的评论,因为我在这里发帖很长 - :

HTTP标头主要分为两种类型: HTTP请求标头每当您在地址栏中输入网址并尝试访问它时,您的浏览器就会发送< strong> HTTP请求到服务器。 HTTP请求标头包含文本记录表单中的信息,其中包含生成的浏览器的类型,功能和版本等详细信息请求,客户端使用的操作系统,请求的页面,浏览器接受的各种输出,等等。 HTTP响应标头收到请求标头后,Web服务器将HTTP响应标头发送回客户端。 HTTP响应标头包括Web服务器传输回客户端浏览器的文本记录形式的信息。响应标头包含服务器发回的文件的类型,日期和大小等详细信息,以及有关服务器的信息。所以您只是向服务器发送额外信息,让它知道什么类型的服务器请求它接受。

Content-type:application / json; charset = utf-8将内容指定为JSON格式,以UTF-8字符编码进行编码。对于JSON来说,指定编码有点多余,因为JSON的默认(仅?)编码是UTF-8。因此,在这种情况下,接收服务器显然很高兴知道它正在处理JSON并且假设默认情况下编码是UTF-8,这就是为什么它可以使用或不使用标头。

答案 2 :(得分:0)

简单地按如下方式制作字典:

let jsonBody = ["username": email, "password": password]

然后你可以这样做:

let request = NSMutableURLRequest(url: NSURL(string: "YOUR URL") as URL)
        request.httpBody = try! JSONSerialization.data(withJSONObject: jsonBody, options: .prettyPrinted)

希望有所帮助!