Выполнение запросов JSON в Emacs - программирование
Подтвердить что ты не робот

Выполнение запросов 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 тоже нет запросов. Я должен буду сделать это самостоятельно. Я действительно не знаю, что я делаю; Я только начал лихорадочно работать над этим вчера днем.

4b9b3361

Ответ 1

Проблема с другими ответами заключается в том, что API-интерфейс Stack Exchange - это GZIP'd, а url.el, поставляемый с Emacs, не автоматически распаковывает его.

Взгляните на мою библиотеку request.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)))))

request.el хорошо документирован, поставляется с исполняемыми примерами и хорошо протестирован.

Ответ 2

Взгляните на REST Client на GitHub - инструмент для ручного изучения и тестирования веб-сервисов HTTP REST.

Ответ 3

Это может быть не лучший способ делать что-то, но, похоже, это работает для меня.

(defun fetch-json (url)
   (with-current-buffer (url-retrieve-synchronously url)
     ; there probably a better way of stripping the headers
     (search-forward "\n\n")
     (delete-region (point-min) (point))
     (buffer-string)))

Затем вызов этой функции с помощью url вернет содержимое ответа, в данном случае json. Я использовал reddit api в качестве примера, потому что я не уверен, как работает Api Exchange Api.

 (fetch-json "http://reddit.com/r/emacs.json")

Здесь почти нет проверки ошибок, если URL-адрес не возвращает данные, тогда это взорвется.