2013-02-27 15 views
16

Jestem we wczesnych stadiach pisania Emacs major mode do przeglądania i przyczyniając się do witryn w sieci Stos Exchange, w taki sam sposób jak dired i list-packages prac, z kilkoma inspiracje z magit i org-mode.Wykonywanie zapytań JSON w Emacs

Problem polega oczywiście na tym, że mam nie mam pojęcia w jaki sposób chciałbym połączyć Emacsa z SE API (v2.1) w pierwszej kolejności. Nigdy nie robiłem niczego, co wiązałoby się z połączeniem sieciowym w obrębie Elisp, chociaż nie mam nic przeciwko temu samemu językowi (i zajęło to więcej niż kilka spojrzeń na package.el).

Nigdy nie pracowałem z JSON, chociaż jestem w środku W3C's tutorial na tym.

Prosty „hello world” wystarczy, ewentualnie wzdłuż linii

(execute-json-query "/info") 

W3C poradnik nie wydają się iść na prośby, albo. Będę musiał przeprowadzić własne badania na ten temat.
Naprawdę nie mam pojęcia, co robię; Dopiero gorączkowo pracowałem nad tym wczorajszym popołudniem.

Odpowiedz

24

Problem z innymi odpowiedziami polega na tym, że Stack Exchange API is GZIP'd i url.el dostarczone z Emacsem nie rozpakowują go automatycznie.

Spójrz na moją bibliotekę request.el, która obsługuje automatyczną dekompresję (szczerze mówiąc, właśnie dodałem wsparcie). Oto przykład, aby pobrać najbardziej aktywną pytanie 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 jest well documented, pochodzi z executable examples i well tested.

+0

To jest niesamowite. Tak naprawdę patrzyłem na ten pakiet * podczas badania paczki *, ale zostałem na nią zagubiony. Niestety, uruchomienie Twojego przykładu w ten sposób powoduje błąd, który muszę hostować na https://gist.github.com/vermiculus/5050463. –

+0

Jak już wspomniałem, dodałem obsługę gzip. Sprawdź 'request-version', a jeśli nie jest 0.2.0alpha1, musisz ją zaktualizować. – tkf

+0

Potrzebujesz też zwinąć, jeśli potrzebujesz automatycznej dekompresji. – tkf

10

Spójrz na REST Client on GitHub - narzędzie do ręcznego przeglądania i testowania usług internetowych REST HTTP.

+0

To jest naprawdę fajne. Może to w końcu być zaznaczoną odpowiedzią, jeśli nie ma innych, ale * szczególnie * jeśli podasz przykład elispentycznego wyrażenia (używając w razie potrzeby 'restclient'), który rozwiąże zwracany ciąg. –

7

To może nie być najlepszy sposób robienia rzeczy, ale wydaje się, że działa dla mnie.

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

Następnie wywołanie tej funkcji za pomocą adresu URL zwróci treść odpowiedzi, w tym przypadku json. Użyłem interfejsu API Reddit jako przykładu, ponieważ nie jestem pewien, jak działa apia Stack Exchange.

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

Tutaj nie ma prawie żadnych sprawdzeń błędów, jeśli adres URL nie zwróci żadnych danych, spowoduje to wzrost.

+10

FWIW, lepszym sposobem usuwania nagłówków jest '(goto-char url-http-end-of-headers)'. –

Powiązane problemy