在Emacs中发出JSON请求



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

问题是,当然,我不知道如何将Emacs与SE API (v2.1)连接在一起。我从来没有在Elisp中做过任何涉及网络连接的事情,尽管我对这种语言本身很熟悉(并且对package.el进行了多次研究)。

我从来没有使用过JSON,尽管我正在学习W3C的教程。

一个简单的'hello world'就足够了,可能沿着

的行
(execute-json-query "/info")

W3C教程似乎也没有详细介绍请求。我得自己研究一下。
我真的不知道我在做什么;我昨天下午才开始狂热地做这件事。

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

看看我的请求。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)))))

请求。El有很好的文档,附带了可执行的示例,并且经过了很好的测试。

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

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

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

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

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

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

最新更新