Uma alternativa de nível superior ao uso url-http-end-of-headers
, mas igualmente indocumentada, é url-insert-file-contents
:
(with-temp-buffer
(url-insert-file-contents
"https://api.stackexchange.com/2.2/questions/12464?site=emacs")
(json-parse-buffer :object-type 'alist))
ou equivalente, antes do Emacs 27 compilado com suporte JSON nativo:
(require 'json)
(with-temp-buffer
(url-insert-file-contents
"https://api.stackexchange.com/2.2/questions/12464?site=emacs")
(let ((json-false :false))
(json-read)))
Isso resulta em:
((items .
[((tags .
["url" "http"])
(owner
(reputation . 10741)
(user_id . 227)
(user_type . "registered")
(accept_rate . 89)
(profile_image . "https://i.stack.imgur.com/ebO5J.jpg?s=128&g=1")
(display_name . "lunaryorn")
(link . "https://emacs.stackexchange.com/users/227/lunaryorn"))
(is_answered . t)
(view_count . 867)
(accepted_answer_id . 29798)
(answer_count . 3)
(score . 4)
(last_activity_date . 1517363132)
(creation_date . 1431861037)
(question_id . 12464)
(link . "/emacs/12464/go-to-body-after-url-retrieve-synchronously")
(title . "Go to body after url-retrieve-synchronously"))])
(has_more . :false)
(quota_max . 300)
(quota_remaining . 276))
A função url-insert-file-contents
envolve as funções mais bem documentadas url-insert-buffer-contents
e url-insert
e, portanto, vem com os seguintes extras:
- Carregado automaticamente por padrão.
- Existe desde pelo menos no Emacs 21.
- Tratamento simples de erros de resposta HTTP via
url-http-response-status
.
- Decodifica dados.
FWIW, ele também vem com a garantia de ser usado por lisp/emacs-lisp/package.el
.
url-http-end-of-headers
é preferível a essa abordagem. Eu realmente esperava algo comourl-http-goto-body
:( #