如何将emacs挂钩到json服务?

时间:2014-09-05 19:17:08

标签: json asp.net-web-api emacs elisp

我不太了解编程emacs,但我知道如何用Lispy语言编程。我有一个服务,它监视项目目录并通过类似其他的Web界面生成结果。我想将emacs挂钩到这个服务中,并且可能使用这种方案为emacs编写一些功能。我不确定在emacs方面从哪里开始。那么哪些lib最适合用于访问Web服务?

2 个答案:

答案 0 :(得分:9)

Emacs对此类内容有相当好的内置支持,至少在发出请求和解析响应的基本级别上。使用url-retrieveurl-retrieve-synchronously从远程服务获取数据。顾名思义,一个是异步调用,它接受一个回调,另一个是阻塞调用,它返回一个包含响应的缓冲区。通过在Elisp文件中包含(require 'url)来加载它们。

url-函数记录在与Elisp其余部分名为“URL”的单独的Info手册中,但有些有用的功能在那里没有提到。对于在URL中传递参数的GET请求,url-build-query-string函数对于从一组键和值构造查询参数字符串非常有用。对于POST,PUT,DELETE和其他请求,您可能需要对变量url-request-dataurl-request-methodurl-request-extra-headers进行绑定。他们有丰富的文档信息。

对HTTP URL使用这些调用的最后一个令人困惑的事情是,它们将HTTP响应头保留在与响应主体相同的缓冲区中,这可能不是您所期望的。解决这个问题的一个简单方法是在处理正文之前使用(未记录的)url-http-end-of-headers变量跳过标题,但我怀疑可能有更好的方法。

使用json-read函数解析JSON响应,并绑定变量json-array-typejson-object-typejson-key-type以控制JSON类型如何转换为Lisp类型。通过包含(require 'json)获得此功能。可以使用xml-parse-regionlibxml-xml-parse-region来解析XML响应。后者要求使用libxml支持编译Emacs,前者在Elisp中实现。

将这些放在一起,对JSON服务的请求的框架看起来像这样:

(url-retrieve
 "http://example.com/api/some/request"
 (lambda (events)
   (goto-char url-http-end-of-headers)
   (let ((json-object-type 'plist)
         (json-key-type 'symbol)
         (json-array-type 'vector))
     (let ((result (json-read)))
       ;; Do something with RESULT here
       ))))

在回调中,您可以像任何其他Lisp值一样使用resultplist-getpcasecl-destructuring-bind函数通常可用于提取结果的各个部分。使用(require 'pcase)获取pcase宏,(require 'cl-lib)获取cl-destructuring-bind

答案 1 :(得分:1)

这是我用来通过rate-exchange.appspot.com从json webservice查询货币汇率的方法:

(defun my-json-get (url)
  (interactive)
  (progn
    (require 'json)
    (with-current-buffer (url-retrieve-synchronously url)
      (goto-char (point-min))
      (re-search-forward "^$")
      (json-read))))
(defun my-currency-exchange-rate (from to)
  (let ((xurl (format "http://rate-exchange.appspot.com/currency?from=%s&to=%s" from to)))
    (assoc-default 'rate (my-json-get xurl))))

使用示例:

(my-currency-exchange-rate "USD" "SEK")