我对编程emacs了解不多,但我确实知道如何用Lispy语言编程。我有一个服务可以观看项目目录,并通过类似休息的Web界面产生结果。我想挂钩emacs到这个服务,也许使用这种方案来编写emacs的一些功能。我真的不知道从哪里开始在emacs方面。那么,什么库最适合打网络服务?如何将emacs挂接到json服务?
回答
Emacs对这种事情有很好的内置支持,至少在进行请求和解析响应的基础级别上。使用url-retrieve
或url-retrieve-synchronously
从远程服务获取数据。正如名字所暗示的,一个是一个异步调用,它接受一个回调,另一个是阻塞调用,它返回一个包含响应的缓冲区。通过在您的Elisp文件中包含(require 'url)
加载它们。
url-
函数记录在与Elisp其余部分分开的信息手册中,名为“URL”,但在此处未提及一些有用的功能。对于在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响应可以使用xml-parse-region
或libxml-xml-parse-region
进行分析。后者要求Emacs与libxml支持编译,前者在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
))))
在回调中,您可以用result
像任何其他的Lisp价值的工作。 plist-get
,pcase
和cl-destructuring-bind
函数通常用于提取结果片段。使用(require 'pcase)
得到pcase
宏,(require 'cl-lib)
得到cl-destructuring-bind
。
这是我用在rate-exchange.appspot.com查找从JSON Web服务货币汇率:
(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")
- 1. 如何使用OpenCover挂接到服务?
- 2. 如何挂钩到在Emacs
- 3. 连接到MS Exchange服务器挂起
- 4. 连接到SQL服务器挂在con.Open()
- 5. 将emacs连接到远程的ensime服务器
- 6. 如何将Sqlcmd连接到服务器?
- 7. 如何将Android连接到服务器
- 8. 如何挂接到XirSys的信令服务器而不是Priologic
- 9. Emacs:如何调试挂钩?
- 10. 无法将VS2010挂接到Web服务数据源
- 11. C#的Web服务,如何接收JSON
- 12. 将PHP Web服务如何读取JSON
- 13. 如何挂接到webservice
- 14. 如何保护emacs服务器?
- 15. 如何让JSon从服务器到ListView?
- 16. 如何使Json请求到服务器?
- 17. 如何发布json到HTTP服务器
- 18. 如何使用emacs连接oracle服务器?
- 19. django/python如何通过发布json连接到web服务
- 20. 如何使用web服务将json数组发布到Php服务器
- 21. Twisted服务器TLS挂在连接
- 22. Bayeux服务器挂起连接请求
- 23. 服务器套接字挂起Close_Wait
- 24. 如何将iPad直接连接到MySQL服务器?
- 25. 通过JSON将Android应用程序连接到Java服务器
- 26. 将数据POST到PHP的JSON服务
- 27. 无法将JSON发送到服务器
- 28. 如何将JSON数据发送到android中的服务器?
- 29. 如何使用改进将json数据发送到服务器?
- 30. 如何使用Volley将JSON对象发送到服务器
HTTP的可能重复:// stackoverflow.com/questions/15118304/making-json-requests-within-emacs。那里的答案提到了[请求](https://github.com/tkf/emacs-request)库,我还没有用过。 – 2014-09-07 06:19:08