我正在尝试使用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错误。
我错过了什么?
提前致谢。
答案 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)
希望有所帮助!