在Emacs中发出JSON请求

时间:2013-02-27 17:23:45

标签: json emacs elisp stackexchange-api

我正处于编写Emacs major mode的早期阶段,用于浏览和为Stack Exchange网络上的网站做出贡献,与diredlist-packages的工作方式非常相似来自magitorg-mode的灵感很少。

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

我从未使用过JSON,虽然我正处于W3C's tutorial的中间位置。

一个简单的“你好世界”就足够了,可能是

(execute-json-query "/info")

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

3 个答案:

答案 0 :(得分:26)

其他答案的问题是Emacs附带的Stack Exchange API is GZIP'd和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)))))

request.el为well documented,附带executable examples且为well tested

答案 1 :(得分:11)

查看REST Client on GitHub - 手动浏览和测试HTTP REST网络服务的工具。

答案 2 :(得分: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)))

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

 (fetch-json "http://reddit.com/r/emacs.json")

这里几乎没有错误检查,如果网址没有返回任何数据,那么这将会爆炸。