Request.el";无法创建到api.stackexchange.com的连接;

Request.el";无法创建到api.stackexchange.com的连接;,api,request,elisp,Api,Request,Elisp,我正在使用这个库(可通过MELPA获得)尝试创建一个基本框架,从这个框架开始认真的工作。我想做的就是能够将json read解析的对象返回给调用函数,但我甚至无法建立连接 我知道,要让我的函数返回对象,调用必须同步进行,这就是为什么:sync t。我已经考虑过将其作为一个异步调用,但考虑到它的用例,我认为这不会有什么好处 起初,在我看了这些消息之后,我想‘也许我没有必要的二进制文件。’我用文档中附带的一些示例调用测试了request.el,它们工作得很好,所以就这样结束了 我不知道出了什么事。我

我正在使用这个库(可通过MELPA获得)尝试创建一个基本框架,从这个框架开始认真的工作。我想做的就是能够将
json read
解析的对象返回给调用函数,但我甚至无法建立连接

我知道,要让我的函数返回对象,调用必须同步进行,这就是为什么
:sync t
。我已经考虑过将其作为一个异步调用,但考虑到它的用例,我认为这不会有什么好处

起初,在我看了这些消息之后,我想‘也许我没有必要的二进制文件。’我用文档中附带的一些示例调用测试了
request.el
,它们工作得很好,所以就这样结束了

我不知道出了什么事。我还没有太多处理网络的经验,无论成功与否,也不完全理解我收到的错误信息。据我所知,API的443端口对我进行了静默处理,但我不敢相信这是真的

回溯

Debugger entered--Lisp error: (error "Could not create connection to api.stackexchange.com:443")
  signal(error ("Could not create connection to api.stackexchange.com:443"))
  error("Could not create connection to %s:%d" "api.stackexchange.com" 443)
  url-http([cl-struct-url "https" nil nil "api.stackexchange.com" nil "/2.1/sites?&" nil nil t nil t] #[128 "\302\303\304p#\210\300\305\240\210\301p\240\207" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)"] (nil))
  url-https([cl-struct-url "https" nil nil "api.stackexchange.com" nil "/2.1/sites?&" nil nil t nil t] #[128 "\302\303\304p#\210\300\305\240\210\301p\240\207" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)"] (nil))
  url-retrieve-internal("https://api.stackexchange.com/2.1/sites?&" #[128 "\302\303\304p#\210\300\305\240\210\301p\240\207" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)"] (nil) nil nil)
  url-retrieve("https://api.stackexchange.com/2.1/sites?&" #[128 "\302\303\304p#\210\300\305\240\210\301p\240\207" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)"])
  url-retrieve-synchronously("https://api.stackexchange.com/2.1/sites?&")
  request--url-retrieve-sync("https://api.stackexchange.com/2.1/sites?&" :params "page=2&page_size=25&" :parser json-read :sync t :error (closure (t) (&rest args) (apply (quote request-default-error-callback) (quote "https://api.stackexchange.com/2.1/sites?") args)) :url "https://api.stackexchange.com/2.1/sites?&" :response [cl-struct-request-response nil nil nil nil nil "https://api.stackexchange.com/2.1/sites?&" nil (:params "page=2&page_size=25&" :parser json-read :sync t :error (closure (t) (&rest args) (apply (quote request-default-error-callback) (quote "https://api.stackexchange.com/2.1/sites?") args)) :url "https://api.stackexchange.com/2.1/sites?&" :response #0) nil nil nil url-retrieve nil])
  apply(request--url-retrieve-sync "https://api.stackexchange.com/2.1/sites?&" (:params "page=2&page_size=25&" :parser json-read :sync t :error (closure (t) (&rest args) (apply (quote request-default-error-callback) (quote "https://api.stackexchange.com/2.1/sites?") args)) :url "https://api.stackexchange.com/2.1/sites?&" :response [cl-struct-request-response nil nil nil nil nil "https://api.stackexchange.com/2.1/sites?&" nil #0 nil nil nil url-retrieve nil]))
  request("https://api.stackexchange.com/2.1/sites?" :params "page=2&page_size=25&" :parser json-read :sync t)
  (let* ((base-call (concat stack-api-root call "?")) (options (alist-to-json keys-alist))) (request base-call :params options :parser (quote json-read) :sync t))
  stack-api-request("sites" ((page . 2) (page_size . 25)))
  eval((stack-api-request "sites" (quote ((page . 2) (page_size . 25)))) nil)
  eval-expression((stack-api-request "sites" (quote ((page . 2) (page_size . 25)))) nil)
  call-interactively(eval-expression nil nil)
信息:

Contacting host: api.stackexchange.com:443
Opening TLS connection to `api.stackexchange.com'...
Opening TLS connection with `gnutls-cli --insecure -p 443 api.stackexchange.com'...failed
Opening TLS connection with `gnutls-cli --insecure -p 443 api.stackexchange.com --protocols ssl3'...failed
Opening TLS connection with `openssl s_client -connect api.stackexchange.com:443 -no_ssl2 -ign_eof'...failed
Opening TLS connection to `api.stackexchange.com'...failed

确保这不是卷曲的问题。我对
curl
使用的调用是

curl api.stackexchange.com/2.1/sites --compressed

从外部查看
request
存储库,
request
也在这样做。我不知道会出什么问题。

我将您的示例简化为以下代码片段,以重现您的问题,但它确实有效。你能试试这个吗

(request
 "http://api.stackexchange.com/2.1/sites"
 :parser 'json-read
 :params '((page . "2") (page_size . "25"))
 :success (lambda (&rest args) (princ (plist-get args :data))))
它应该将一些数据打印到
*消息*
缓冲区和回显区


编辑:您的示例中的问题似乎是您正在将字符串传递给
PARAMS
,这只需要一个参数。我将更改代码以引发错误,以便更容易调试。

我没有时间仔细研究这个问题,但您是否与curl backend一起检查了它?也许这是另一个url.el的错误。如果您有curl(命令行1,而不是libcurl),它将自动使用。我建议通过url.el使用它。@tkf首先感谢阅读。我忘记了我在一台残废的计算机上(windows,没有cygwin/admin;很长很悲伤的故事),我将研究
curl
业务-我想象有一个独立的windows版本可以使用,我会报告更新。“连接到…api…/站点时请求[错误]错误(error)”这是一个很大的错误,但是代码是60(并且,假设这是一个
curl
错误,“对等证书不能用已知的CA证书进行身份验证。”)鉴于我得到了一个不同的结果,我认为我做得对,我只是无法在Windows端口和
url.el
之间获胜。如果这是CA证书的东西,那么我猜这不是url.el的错误。我认为最好尝试使用curl命令行连接到API,并打开另一个问题。我想很多人比Emacs Lisp更了解curl,所以我想(希望)你会得到一些好的答案。从中的帖子示例中,字符串应该是等价的,no?数据允许字符串,但不允许参数。PARAMS指向url,数据模仿HTML表单等。不过,PARAMS可能应该接受字符串。啊,我现在明白了。这里有两个不同的论点。谢谢你的清理!!
(request
 "http://api.stackexchange.com/2.1/sites"
 :parser 'json-read
 :params '((page . "2") (page_size . "25"))
 :success (lambda (&rest args) (princ (plist-get args :data))))