我正在使用一个稍微不同寻常的API,期待一个带有GET请求的JSON主体,而我无法控制它。不幸的是,每当我尝试发出请求时,它似乎完全消失,并且从未进入API。我最初使用标准URLSession编写请求,然后切换到尝试Alamofire尝试修复它但结果却相同。我的请求如下:
Alamofire.request("http://192.168.1.1:8000/connect/", method: .get, parameters: ["test": "test"], encoding: JSONEncoding.default)
.responseJSON { response in
let body = response.request?.httpBody
guard response.result.isSuccess else {
onCompletion(nil)
return
}
onCompletion(response.result.value as! [String : Any]?)
}
这个确切的代码适用于身体中没有JSON的不同请求,但似乎在我添加它的那一刻,它只是超时。这已经在alamofire github repo(https://github.com/Alamofire/Alamofire/issues/1819)上进行了讨论,但对应该是什么工作代码的最终评论与我的任何不同都没有,所以没有提供任何帮助,也没有其他相关问题。
使用debugPrint
打印请求给我这个卷曲命令
$ curl -i \
-H "Content-Type: application/json" \
-d "{\"test\":\"test\"}" \
"http://192.168.1.1:8000/connect/"
哪个缺少-X GET
标志,但是当我添加它时,请求按预期工作并且服务器响应,所以我知道API本身正在工作并且很乐意处理正文中的JSON,所以我不知道该怎么回事。
我已经安装了Timberjack以试图追踪事情,这些事情根本没有给我任何信息,就像我已经知道的那样
Request: GET http://192.168.1.1:8000/connect/
Headers: [
Content-Type : application/json
Content-Length : 24
]
虽然我不确定它是否应该向我展示身体,但它不是?
在这两种情况下(URLSession和Alamofire),请求都会提供以下输出,我在其他任何时候都看不到:
2017-01-22 23:31:09.797453 my-app[3755:1349066] [] nw_endpoint_flow_service_writes [2 192.168.1.1:8000 ready socket-flow (satisfied)] Write request has 4294967295 frame count, 0 byte count
2017-01-22 23:32:04.484182 my-app[3755:1349066] [] __tcp_connection_write_eof_block_invoke Write close callback received error: [89] Operation canceled
任何人都对我发生的事情有任何想法,因为我现在完全不知所措。
我已经做了一些挖掘工作。如果我将端点更改为https://httpbin.org/get
,那么请求通过就好了,我得到了响应。虽然这种情况表明API服务器拒绝处理请求,但它仍在使用cURL命令,因此无法解决问题。
我也忘了提及(虽然不确定它应该有所作为)我尝试与之通信的API是通过ad-hoc wifi连接的。其他请求工作正常,但我绝对可以与之沟通。
所以我已经能够将服务器切换到使用POST而不是GET,并且毫不奇怪它现在有效,但是我仍然想知道解决原始问题的方法
答案 0 :(得分:0)
URLSession和CFHTTPMessage无法发送GET请求的消息正文。它们发送正文的内容长度,但不发送正文本身。这样会导致超时。
为了解决此问题,我使用libcurl来处理GET请求,该请求具有到项目的消息正文。我在其他任何地方都使用URLSession。当您使用libcurl向请求中添加主体时,会将请求更改为POST,但可以在设置主体之后并提交请求之前将其更改回GET。