在Emacs中进行JSON请求

21
我正在编写一个Emacs major mode,用于浏览和贡献Stack Exchange网络站点,类似于diredlist-packages的工作方式,并从magitorg-mode中获得一些启示。
问题是,我当然不知道如何首先将Emacs与SE API(v2.1)进行接口。我从未在Elisp中涉及网络连接的任何事情,尽管我对语言本身感到舒适(并且已经多次查看了package.el)。
我从未使用过JSON,尽管我正在进行W3C的教程
一个简单的“hello world”就足够了,可能是这样的。
(execute-json-query "/info")

W3C教程似乎也没有涉及请求,我需要自己进行研究。
我真的不知道我在做什么;我昨天下午才开始疯狂地工作。
3个回答

27
其他答案的问题在于Stack Exchange API is GZIP'd,而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是文档完善的,附带有可执行示例,并且经过了充分测试

Melpa只是指向其软件包列表中的二进制文件吗?那就是我从中安装你的插件的地方。 - Sean Allred
1
它需要一些时间来被 Melpa 打包。请访问 https://twitter.com/melpa_emacs。 - tkf
1
这个 request.el 库看起来很棒。谢谢 tkf。 - Randy Morris
你需要使用 &allow-other-keys 的原因在于文档 http://tkf.github.com/emacs-request/manual.html#request 中有详细说明。如果你不知道 &allow-other-keys 的作用,请阅读 CL 的文档 M-: (info "(cl) Argument Lists") ERT - tkf
啊!assoc-default 就是我一直在寻找的东西。谢谢你的答案。 - Joe Heyming
显示剩余10条评论

11

1
这真的很酷。如果没有其他答案,这可能会成为标记答案,但是特别地,如果您提供一个elisp表达式的示例(如有必要使用restclient),该表达式将解析为返回的字符串。 - Sean Allred

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没有返回数据,那么程序将会崩溃。


12
就翻译而言,内容为:“FWIW, the better way of stripping the headers is (goto-char url-http-end-of-headers).” 可以这样翻译:就此而言,“(goto-char url-http-end-of-headers)”是更好的去除头部信息的方法。 - Kris Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接