Выполнение запросов 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-адрес не возвращает никаких данных, это взорвется.