2013-02-27 14 views
16

io sono nelle prime fasi di scrittura di un Emacs major mode per la navigazione e contribuendo a siti sulla rete Stack Exchange, più o meno allo stesso modo in cui dired e list-packages lavori, con alcune ispirazioni da magit e org-mode.fare richieste JSON all'interno Emacs

Il problema è, naturalmente, ho nessuna idea come vorrei interfacciare Emacs con l'API SE (v2.1) in primo luogo. Non ho mai fatto nulla che riguardi una connessione di rete all'interno di Elisp, anche se mi trovo a mio agio con il linguaggio stesso (e ho preso più di qualche occhiata a package.el).

Non ho mai lavorato con JSON, anche se sono nel mezzo di W3C's tutorial su di esso.

Un semplice 'ciao mondo' sarebbe sufficiente, forse lungo le linee di

(execute-json-query "/info") 

Il tutorial W3C non sembra andare oltre le richieste, sia. Dovrò fare le mie ricerche su questo.
Davvero non ho idea di quello che sto facendo; Ho appena iniziato a lavorare febbrilmente a questo ieri pomeriggio.

risposta

24

Il problema con altre risposte è che Stack Exchange API is GZIP'd e url.el fornito con Emacs non lo decomprime automaticamente.

Dai un'occhiata alla mia libreria request.el che supporta la decompressione automatica (ad essere sincero, ho appena aggiunto il supporto). Ecco un esempio per andare a prendere la questione più attivo in 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 è well documented, viene fornito con executable examples ed è well tested.

+0

Questo è fantastico. In realtà ho guardato questo pacchetto * mentre stavo cercando il pacchetto * ma ero perso per questo. Sfortunatamente, l'esecuzione del tuo esempio così com'è genera un errore che devo ospitare su https://gist.github.com/vermiculus/5050463. –

+0

Come ho già detto, ho appena aggiunto il supporto per gzip. Controlla 'request-version' e se non è 0.2.0alpha1, devi aggiornarlo. – tkf

+0

Inoltre, è necessario arricciare se è necessaria la decompressione automatica. – tkf

10

Dai uno sguardo allo REST Client on GitHub: uno strumento per esplorare manualmente e testare i servizi web REST HTTP.

+0

Questo è davvero bello. Questo potrebbe finire per essere la risposta marcata se non ce ne sono altri, ma * specialmente * se si fornisce un esempio di un'espressione elisp (usando 'restclient' se necessario) che si risolverà nella stringa restituita. –

7

Questo potrebbe non essere il modo migliore di fare le cose ma sembra funzionare per me.

(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))) 

Quindi chiamare questa funzione con un URL restituisce il contenuto della risposta, in questo caso, JSON. Ho usato il reddit api come esempio perché non sono sicuro di come funziona l'Exchange Stack api.

Non c'è praticamente nessun controllo degli errori incluso qui, se l'url non restituisce dati, questo esploderà.

+10

FWIW, il modo migliore per rimuovere le intestazioni è '(goto-char url-http-end-of-headers)'. –

Problemi correlati