Разбор webhook с помощью emacs-веб-сервер

#github #emacs #webserver

#github #emacs #веб-сервер

Вопрос:

Я использую emacs-web-server и ngrok для получения Webhooks из GitHub. Что касается настройки, я вручную запускаю запросы с Github с помощью кнопки повторной отправки на сайте Github:

Отправлено с GitHub

Я использую следующий код для обработки запроса от GitHub:

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

Пример emacs-web-server POST можно найти здесь:
http://eschulte.github.io/emacs-web-server/POST-Echo.html#POST-Echo

Он работает просто отлично, и print pending в моем буфере сообщений отображается следующее:

Запрос

Но у меня возникли проблемы с выделением полезной нагрузки в переменной (то есть всего содержимого после разрыва на две строки: {"ref".. и далее). Я пробовал несколько регулярных выражений; Все они, похоже, работают, когда я использую их в буфере с нуля со вставленной копией ожидающей переменной, но не работают в реальном сценарии полезной нагрузки. Предположительно ^M , s имеют к этому какое-то отношение, поскольку их нет, когда содержимое вставляется в другой буфер. Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.

Спасибо!

Ответ №1:

В вашем примере у вас есть строка, содержащая HTTP-запрос, в теле которого находится документ JSON. Вы определенно не хотите разбирать это самостоятельно с помощью регулярных выражений.

Обычная процедура в подобных ситуациях заключается в том, чтобы сначала проанализировать HTTP-запрос, используя подходящую библиотеку, получить тело из результата (используя вызов метода библиотеки) и, наконец, проанализировать документ JSON в теле, используя другую подходящую библиотеку.

Я сделал это, например, в Clojure для получения вызовов webhook из GitHub, хотя я никогда не использовал Emacs для такого рода вещей.

Быстрый поиск анализаторов HTTP-запросов и анализаторов JSON дал https://tkf.github.io/emacs-request / и http://tess.oconnor.cx/2006/03/json.el . Может быть, они полезны для вас.

Комментарии:

1. Привет, Стефан, спасибо за вдумчивый ответ. Я понимаю, что emacs-web-server на самом деле это должно быть выполнение синтаксического анализа запроса, как и для простых запросов POST. Я не особенно знаком с объектной системой common lisp, но кажется странным, что интерфейс, с помощью которого можно получить доступ к полезной нагрузке, находится через pending слот.

2. Привет! @AesopHimself У меня похожая проблема, и я нашел ваш вопрос: вам удалось решить ее случайно? Я бы ожидал, что веб-сервер emacs обработает запрос самостоятельно: (

Ответ №2:

receiver.el — это библиотека Emacs, которую я написал для выполнения того, что, как я полагаю, вы хотите сделать, но с использованием elnode в качестве веб-сервера и beame-insta-ssl в качестве туннеля. Было бы легко изменить его, чтобы использовать ngrok вместо beame-insta-ssl, и запрос на извлечение для этого будет приветствоваться.

Ответ №3:

Возвращаясь назад, как недавно спросил @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/