Haciendo peticiones JSON dentro de Emacs
elisp stackexchange-api (3)
Eche un vistazo a REST Client en GitHub , una herramienta para explorar y probar manualmente los servicios web HTTP REST.
Estoy en las primeras etapas de escribir un modo principal de Emacs para navegar y contribuir a sitios en la red de Stack Exchange, de la misma manera que funciona dired
y list-packages
, con algunas inspiraciones de magit
y org-mode
.
El problema es que, por supuesto, no tengo idea de cómo conectaría Emacs con la API de SE (v2.1) en primer lugar. Nunca he hecho nada que implique una conexión de red dentro de Elisp, aunque me siento cómodo con el lenguaje en sí (y he echado un vistazo a package.el
).
Nunca he trabajado con JSON, aunque estoy en el medio del tutorial de W3C .
Un simple ''hola mundo'' sería suficiente, posiblemente en la línea de
(execute-json-query "/info")
El tutorial de W3C tampoco parece revisar las solicitudes. Tendré que hacer mi propia investigación sobre eso.
Realmente no tengo idea de lo que estoy haciendo; Acabo de empezar a trabajar febrilmente esta tarde de ayer.
El problema con otras respuestas es que la API de Exchange Stack es GZIP''d y url.el que se incluye con Emacs no lo descomprime automáticamente.
Eche un vistazo a mi biblioteca request.el que admite la descompresión automática (para ser sincero, acabo de agregar el soporte). Aquí hay un ejemplo para obtener la pregunta más activa en :
(request
"https://api.stackexchange.com/2.1/questions"
:params ''((order . "desc")
(sort . "activity")
(site . ""))
: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 está bien documentado , viene con ejemplos ejecutables y está bien probado .
Puede que esta no sea la mejor manera de hacer las cosas, pero parece funcionar para mí.
(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)))
Luego, al llamar a esta función con una URL, se devolverá el contenido de la respuesta, en este caso, json. He usado la reddit api como ejemplo porque no estoy seguro de cómo funciona la API de Stack Exchange.
(fetch-json "http://reddit.com/r/emacs.json")
Aquí no se incluye la verificación de errores, si la url no devuelve datos, esto estallará.