【发布时间】:2017-06-07 10:27:35
【问题描述】:
我正在使用一个稍微非常规的 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 命令
$ 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 是通过临时 wifi 连接的。其他对它的请求工作得很好,所以我绝对可以与它交流。
更新 2
所以我已经能够将服务器切换到使用 POST 而不是 GET 并且不出所料它现在可以工作了,但是我仍然很想知道原始问题的解决方案
【问题讨论】:
-
您是否尝试过该解决方案来删除您的消息:stackoverflow.com/questions/39791692/…?这是后台请求吗?
-
是的,它只是抑制了错误日志,但没有做更多的事情。
-
好的。我有一个类似的问题,它是我的 json 编码错误,尝试使用这个答案,为我做了诀窍stackoverflow.com/a/39959559/1385773
-
好吧,编码本身似乎还不错。我检查了请求的内容,JSON 似乎很好,奇怪地将请求 URL 更改为
https://httpbin.org/get似乎按预期工作 -
您可以访问您的网络服务器日志吗?您收到此服务器的响应了吗?如果 Web 服务器收到请求,即使是错误 (500),它也会始终发回响应。也许你应该使用像 Postman 这样的工具来调试发生了什么?