我不太了解编程emacs,但我知道如何用Lispy语言编程。我有一个服务,它监视项目目录并通过类似其他的Web界面生成结果。我想将emacs挂钩到这个服务中,并且可能使用这种方案为emacs编写一些功能。我不确定在emacs方面从哪里开始。那么哪些lib最适合用于访问Web服务?
答案 0 :(得分:9)
Emacs对此类内容有相当好的内置支持,至少在发出请求和解析响应的基本级别上。使用url-retrieve
或url-retrieve-synchronously
从远程服务获取数据。顾名思义,一个是异步调用,它接受一个回调,另一个是阻塞调用,它返回一个包含响应的缓冲区。通过在Elisp文件中包含(require 'url)
来加载它们。
url-
函数记录在与Elisp其余部分名为“URL”的单独的Info手册中,但有些有用的功能在那里没有提到。对于在URL中传递参数的GET请求,url-build-query-string
函数对于从一组键和值构造查询参数字符串非常有用。对于POST,PUT,DELETE和其他请求,您可能需要对变量url-request-data
,url-request-method
和url-request-extra-headers
进行绑定。他们有丰富的文档信息。
对HTTP URL使用这些调用的最后一个令人困惑的事情是,它们将HTTP响应头保留在与响应主体相同的缓冲区中,这可能不是您所期望的。解决这个问题的一个简单方法是在处理正文之前使用(未记录的)url-http-end-of-headers
变量跳过标题,但我怀疑可能有更好的方法。
使用json-read
函数解析JSON响应,并绑定变量json-array-type
,json-object-type
和json-key-type
以控制JSON类型如何转换为Lisp类型。通过包含(require 'json)
获得此功能。可以使用xml-parse-region
或libxml-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值一样使用result
。 plist-get
,pcase
和cl-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")