21

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

问题是,当然,我一开始不知道如何将 Emacs 与 SE API (v2.1) 接口。我从来没有在 Elisp 中做过任何涉及网络连接的事情,尽管我对语言本身很满意(并且已经看过很多次了package.el)。

我从未使用过 JSON,尽管我正在学习 W3C 的教程

一个简单的“hello world”就足够了,可能类似于

(execute-json-query "/info")

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

4

3 回答 3

27

其他答案的问题是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)))))

request.el 有很好的文档记录,带有可执行的示例并且经过了很好的测试

于 2013-02-27T18:33:22.187 回答
11

看看GitHub 上的 REST Client - 一个手动探索和测试 HTTP REST Web 服务的工具。

于 2013-02-27T17:58:46.617 回答
8

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

(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")

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

于 2013-02-27T18:22:13.280 回答