在Emacs中发出JSON请求

Sea*_*red 18 emacs json elisp stackexchange-api

我正处于编写Emacs主要模式的早期阶段,用于浏览和贡献Stack Exchange网络上的网站,其方式diredlist-packages工作方式大致相同,并且有一些灵感来自magitorg-mode.

问题是,当然,我不知道如何首先将Emacs与SE API(v2.1)连接起来.我从来没有做过任何涉及Elisp内部网络连接的事情,虽然我对语言本身很满意(并且已经考虑了很多package.el).

我从未使用过JSON,尽管我正处于W3C教程的中间.

一个简单的"你好世界"就足够了,可能就是这样

(execute-json-query "/info")
Run Code Online (Sandbox Code Playgroud)

W3C教程似乎也不会过度请求.我将不得不对此进行自己的研究.
我真的不知道自己在做什么; 我昨天下午才开始疯狂地工作.

tkf*_*tkf 26

其他答案的问题是Stack Exchange API是GZIP并且Emacs附带的url.el不会自动解压缩它.

看看我的request.el库,它支持自动解压缩(说实话,我刚刚添加了支持).以下是获取stackoverflow中最活跃的问题的示例:

(request
 "https://api.stackexchange.com/2.1/questions"
 :params '((order . "desc")
           (sort . "activity")
           (site . "stackoverflow"))
 :parser 'json-read
 :success (function*
           (lambda (&key data &allow-other-keys)
             (let* ((item (elt (assoc-default 'items data) 0))
                    (title (assoc-default 'title item))
                    (tags (assoc-default 'tags item)))
               (message "%s %S" title tags)))))
Run Code Online (Sandbox Code Playgroud)

request.el有很好的文档,带有可执行的示例,经过了充分的测试.


Dav*_*ski 11

看看GitHub上的REST Client - 一个手动浏览和测试HTTP REST Web服务的工具.


Ran*_*ris 7

这可能不是最好的做事方式,但它似乎对我有用.

(defun fetch-json (url)
   (with-current-buffer (url-retrieve-synchronously url)
     ; there's probably a better way of stripping the headers
     (search-forward "\n\n")
     (delete-region (point-min) (point))
     (buffer-string)))
Run Code Online (Sandbox Code Playgroud)

然后使用url调用此函数将返回响应的内容,在本例中为json.我使用reddit api作为例子,因为我不确定Stack Exchange api是如何工作的.

 (fetch-json "http://reddit.com/r/emacs.json")
Run Code Online (Sandbox Code Playgroud)

这里包含的错误检查几乎没有,如果url没有返回任何数据,那么这将会爆炸.

  • FWIW,剥离标题的更好方法是`(goto-char url-http-end-of-headers)`. (10认同)