使用emacs-web-server解析webhook

时间:2016-10-16 19:16:43

标签: github emacs webserver

我使用emacs-web-serverngrok从GitHub接收Webhooks。关于设置,我通过Github网站上的Redeliver按钮手动触发Github的请求:

Sent from GitHub

我使用以下代码处理来自GitHub的请求:

(ws-start
 '(((:POST . ".*") .
    (lambda (request)
      (with-slots (process headers pending) request
        (print "# pending start #")
        (print pending)))))
 9005)

可在此处找到示例emacs-web-server POSThttp://eschulte.github.io/emacs-web-server/POST-Echo.html#POST-Echo

一切正常,print pending在我的消息缓冲区中显示以下内容:

Request

但是我无法在变量中隔离有效负载(也就是说,双线后面的所有内容都会中断:{\"ref\"..和on)。我试过几个正则表达式;当我在暂存缓冲区中使用它们并使用挂起的挂起副本但在实际有效负载场景中不起作用时,这些似乎都有效。据推测,^M与此有关,因为当内容粘贴到另一个缓冲区时它们不存在。如果有人能指出我正确的方向,那将非常感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

在您的示例中,您有一个包含HTTP请求的字符串,其中正文是JSON文档。你绝对不想用正则表达式自己解析它。

这种情况下的常见过程是首先使用合适的库解析HTTP请求,从结果中获取正文(使用库的方法调用),然后使用其他合适的方法解析正文中的JSON文档库。

我已经在Clojure中完成了这项工作,接收来自GitHub的webhook调用,但我从未使用过Emacs这类东西。

快速搜索HTTP请求解析器和JSON解析器,产生https://tkf.github.io/emacs-request/http://tess.oconnor.cx/2006/03/json.el。也许它们对你有用。

答案 1 :(得分:1)

receiver.el是我编写的Emacs库,用于完成我认为您要做的事情,但使用elnode作为Web服务器并使用beame-insta-ssl作为隧道。修改它以使用ngrok而不是beame-insta-ssl很容易,并且欢迎拉动请求。

答案 2 :(得分:1)

回圈为@ Rick77最近查询。

我能够通过手动读取响应来处理/解析请求。

但是最近我遇到了类似的情况(传出请求除外),此后发现使用'request和'json库是一种更简单的方法:

(require 'json)
(require 'request)

(defun get-response-data (url)
  (let* ((res (request url :sync t))
         (data (request-response-data res)))
    (json-read-from-string data)))

https://github.com/ryancrum/json.el

https://tkf.github.io/emacs-request/