【问题标题】:Making JSON requests within Emacs在 Emacs 中发出 JSON 请求
【发布时间】:2013-02-13 15:02:38
【问题描述】:

我正处于编写 Emacs major mode 的早期阶段,用于浏览 Stack Exchange 网络上的网站并为网站做出贡献,其方式与 diredlist-packages 的工作方式大致相同,其中一些灵感来自 magitorg-mode

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

我从未使用过 JSON,尽管我正在处理 W3C's tutorial

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

(execute-json-query "/info")

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

【问题讨论】:

    标签: json emacs elisp stackexchange-api


    【解决方案1】:

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

    【讨论】:

    • 这太棒了。我实际上查看了这个包在研究包时,但是却迷失了方向。不幸的是,按原样运行您的示例会产生一个错误,我必须在 gist.github.com/vermiculus/5050463 上托管该错误。
    • 正如我提到的,我刚刚添加了 gzip 支持。检查request-version,如果不是0.2.0alpha1,则需要更新。
    • 另外,如果需要自动解压,还需要curl。
    • melpa打包需要一些时间。结帐twitter.com/melpa_emacs
    • 这个 request.el 库看起来很棒。谢谢 tkf。
    【解决方案2】:

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

    【讨论】:

    • 这真的很酷。如果没有其他答案,这可能最终成为标记答案,但尤其是如果您提供了一个 elisp 表达式示例(必要时使用 restclient),它将解析为返回的字符串。跨度>
    【解决方案3】:

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

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

    【讨论】:

    • FWIW,剥离标题的更好方法是(goto-char url-http-end-of-headers)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多