#github #emacs #webserver
#github #emacs #веб-сервер
Вопрос:
Я использую emacs-web-server
и ngrok
для получения Webhooks из 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)))