Выполнение запросов JSON в Emacs
Я на ранней стадии написания основной режим Emacs для просмотра и внесения вклада в сайты в сети Stack Exchange, во многом так же, как dired
и list-packages
работает, с несколькими вдохновениями от magit
и org-mode
.
проблема, конечно, в том, что у меня идея как я бы взаимодействовал Emacs с SE API (v2.1) в первую очередь. Я никогда не делал ничего, что связано с сетевым подключением в Elisp, хотя я удобно с самим языком (и взяли больше, чем несколько взглядов на package.el
).
Я никогда не работал с JSON, хотя я в середине W3C в уроке на нем.
простого "Привет, мир" было бы достаточно, возможно, по линии
(execute-json-query "/info")
учебник W3C, похоже, также не переходит на запросы. Мне придется провести собственное исследование.
Я действительно понятия не имею, что я делаю; я только начал лихорадочно работал над этим вчера днем.
3 ответов
проблема с другими ответами заключается в том, что API Stack Exchange является GZIP'D и url.el, поставляемый с Emacs, не распаковывает его автоматически.
взгляните на мой запрос.el библиотека, которая поддерживает автоматическую декомпрессию (честно говоря, я только что добавил поддержку). Вот пример, чтобы получить самый активный вопрос в stackoverflow:
(request
"https://api.stackexchange.com/2.1/questions"
:params '((order . "desc")
(sort . "activity")
(site . "stackoverflow"))
:parser 'json-read
:success (function*
(lambda (&key data &allow-other-keys)
(let* ((item (elt (assoc-default 'items data) 0))
(title (assoc-default 'title item))
(tags (assoc-default 'tags item)))
(message "%s %S" title tags)))))
запрос.Эл хорошо документированы, С исполняемый примеры и хорошо протестированы.
посмотри клиент REST на GitHub - инструмент для ручного изучения и тестирования веб-сервисов HTTP REST.
это может быть не лучший способ делать вещи, но, похоже, это работает для меня.
(defun fetch-json (url)
(with-current-buffer (url-retrieve-synchronously url)
; there's probably a better way of stripping the headers
(search-forward "\n\n")
(delete-region (point-min) (point))
(buffer-string)))
затем вызов этой функции с url-адресом вернет содержимое ответа, в данном случае json. Я использовал api reddit в качестве примера, потому что я не уверен, как работает api Stack Exchange.
(fetch-json "http://reddit.com/r/emacs.json")
здесь почти нет проверки ошибок, если url-адрес не возвращает никаких данных, это взорвется.