使用 Alamofire "format=json&body=" 格式化 HTTP 请求
Posted
技术标签:
【中文标题】使用 Alamofire "format=json&body=" 格式化 HTTP 请求【英文标题】:Formatting HTTP request with Alamofire "format=json&body=" 【发布时间】:2019-03-12 06:09:51 【问题描述】:我正在尝试发送一个需要如下所示的 api 请求:
https://api.gibbly.com/1/device?format=json&body="selection"="selectionType":"registered","selectionMatch":"","includeRuntime":true
但是,当我使用下面的代码时,我得到了一个错误。在响应的 [RESULT] 部分中,我得到以下信息:
[RESULT] FAILURE: responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=Invalid value around character 0.))
我已经使用 Postman 尝试了请求,它工作正常,所以我认为问题是由代码引起的。
根据代码中的第一个“打印”语句,HTTP 正文似乎是正确的:
Optional("selection":"selectionType":"registered","selectionMatch":"","includeSettings":true)
我唯一能想到的是 Alamofire 没有在请求中添加“format=json&body=”,但我不知道如何查看是否是这种情况。任何帮助将不胜感激。
let headers: HTTPHeaders = [
"Authorization": "Bearer adsf023494axadf32342",
"Content-Type": "text/json"
]
let parameters: [String: Any] = [
"selection":[
"selectionType":"registered",
"selectionMatch":"",
"includeSettings":true
]
]
Alamofire.request(url!, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON
response in
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
print(response)
【问题讨论】:
你确定那是 API 格式吗?看起来您正在发送作为查询字符串一部分的 HTTP 正文中的数据 如果您在 GET 请求中发送参数,请尝试使用 content-typeapplication/json
,如果不使用 URLEncoding.default
作为编码。
【参考方案1】:
对于 GET 方法,在 Alamofire 请求中使用 URLEncoding.default 而不是 JSONEncoding.default
【讨论】:
谢谢。我试过了,得到一个序列化错误。还有其他想法吗?成功:状态=代码=4; message = "序列化错误。请求不包含正文。确保提供正文并正确指定 POST Content-Type。"; ; 那是因为,在响应中,您正试图像这样打印请求正文, print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue )) 但是您的请求中没有请求正文,因为它是 GET 请求【参考方案2】:好的,想通了。我做了以下事情:(1) 将参数创建为字符串,(2) 对它们进行百分比编码,以便所有字符都可以用作 url,(3) 将编码参数添加到基本 url,以及 (4) 使用带有基本 url 的新 url,然后将参数编码为我的请求的 url。
let url = "https://api.gibbly.com/1/device?format=json&body="
let urlParams = "\"selection\":\"selectionType\":\"registered\",\"selectionMatch\":\"\",\"includeSettings\":true"
let urlEncoded = url + urlParams.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
let headerList : HTTPHeaders = [
"Authorization" : "Bearer " + (KeychainWrapper.standard.string(forKey: "accessToken"))!,
"Content-Type" : "text/json"
]
Alamofire.request(urlEncoded, method: .get, headers: headerList).responseJSON
response in
print(response)
【讨论】:
以上是关于使用 Alamofire "format=json&body=" 格式化 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章
随机获取“网络连接丢失。”迅速使用“Alamofire.request”
使用 Alamofire/SwiftyJSON 获取 JSON 数组的第一个元素
在使用两个嵌套的 alamofire 请求滚动之前,TableView 不显示数据