当我尝试使用 SWI-Prolog 的 http_post/4
时,如下所示:
:- use_module(library(http/http_client).
update(URL, Arg) :-
http_post(URL, form([update = Arg), _, [status_code(204)]).
当我查询此规则并观察 TCP 流量时,我看到 HTTP POST 请求和预期的 204 状态代码回复都立即发生。但是,Prolog 在返回“true”之前最多挂起 30 秒。发生了什么阻止规则立即返回?
我也试过这个变体,但它也挂起:
:- use_module(library(http/http_client).
update(URL, Arg) :-
http_post(URL, form([update = Arg), Reply, [status_code(204)]),
close(Reply).
我对 http_delete/3
有类似的问题,但不是 http_get/3
。
最佳答案
library docs说明 http_post
It is equivalent to http_get/3, except for providing an input document, which is posted using http_post_data/3.
http_get 的选项中有 timeout(+Timeout)。这可能有助于降低延迟,但由于它默认设置为 +infinite,我担心不会解决问题。似乎您正在调用的服务使连接保持事件状态直至超时。
就我个人而言,在 https 上调用 Google API 服务时,我不得不使用 http_open 而不是 http_post...
关于http - SWI-Prolog http_post 和 http_delete 莫名其妙地挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11110036/