Ir al cuerpo después de url-recuperar-sincrónicamente

7

Yo uso url-retrieve-synchronouslypara descargar un archivo JSON desde un servidor remoto. Esta función devuelve un búfer que contiene todo el contenido de la respuesta, incluidos los encabezados HTTP. Sin embargo, solo estoy interesado en el cuerpo.

Ahora, antes de analizar una respuesta HTTP manualmente, ¿cómo puedo saltar al comienzo del cuerpo? He encontrado la variable url-http-end-of-headers, que funciona, pero no está documentada en absoluto, y usarla se siente "sucia". ¿Existe una API adecuada para este propósito?


fuente

Respuestas:

3

Con respecto a una "API adecuada", creo que la respuesta corta, en este momento, es "no", a menos que esté dispuesto a confiar en una biblioteca externa. url-http-end-of-headersparece ser tan bueno como parece, aunque no se menciona en el Manual del programador de URL ni parece estar documentado en la fuente de emacs .

dat
fuente
8

Dado que hay una nueva línea después de los encabezados HTTP, la única alternativa que conozco es usar un re-search-forward:

(with-current-buffer
    (url-retrieve-synchronously my-url)
  (goto-char (point-min))
  (re-search-forward "^$")
  (delete-region (point) (point-min))
  (buffer-string))
mutbuerger
fuente
Bueno, eso es "analizar HTTP" para mí, y creo que url-http-end-of-headerses preferible a este enfoque. Realmente esperaba algo url-http-goto-bodyasí :(
3

Una alternativa de nivel superior al uso url-http-end-of-headers, pero igualmente indocumentada, es 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))

o equivalente, antes de Emacs 27 compilado con soporte nativo de JSON:

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

Estos resultan en:

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

La función url-insert-file-contentsenvuelve las funciones mejor documentados url-insert-buffer-contentsy url-insertpor lo que viene con los siguientes extras:

  1. Carga automática por defecto.
  2. Existe desde al menos desde Emacs 21.
  3. Manejo simple de errores de respuesta HTTP a través de url-http-response-status.
  4. Decodifica datos.

FWIW, también viene con la garantía de ser utilizado por lisp/emacs-lisp/package.el.

Albahaca
fuente