url-retrieve-synchronouslyの後に本文に移動します


7

url-retrieve-synchronouslyリモートサーバーからJSONファイルをダウンロードするために使用します。この関数は、HTTPヘッダーを含む応答のコンテンツ全体を含むバッファーを返します。しかし、私はただ身体に興味があります。

さて、手動でHTTP応答を解析するのではなく、どうすれば本文の先頭にジャンプできますか?url-http-end-of-headers動作する変数を見つけましたが、まったく文書化されておらず、使用すると「汚い」と感じます。この目的のための適切なAPIはありますか?

url  http 

回答:


3

「適切なAPI」に関しては、現時点での短い答えは「いいえ」だと思います。外部ライブラリに依存する意思がない限りは。URL Programmer's Manualにurl-http-end-of-headersは記載されておらず、emacsソースに記載されているようにも見えませんが、それはできる限り良いようです


8

HTTPヘッダーの後に改行があるので、私が知っている唯一の選択肢は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))

それは、私にとっては「HTTPの解析」であり、url-http-end-of-headersこのアプローチよりも望ましいと思います。私は本当にurl-http-goto-bodyそのようなものを望んでいた:(

3

を使用するより高いレベルの代替手段ですurl-http-end-of-headersが、同様に文書化されていません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))

または同等に、ネイティブJSONサポートでコンパイルされたEmacs 27より前:

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

これらの結果:

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

この関数はurl-insert-file-contents、より良い文書化機能をラップurl-insert-buffer-contentsし、url-insertしたがって、以下のグッズが付属しています:

  1. デフォルトで自動ロードされます。
  2. 少なくともEmacs 21から存在しています。
  3. による単純なHTTP応答エラー処理url-http-response-status
  4. データをデコードします。

FWIW、それはによって使用されるという保証も付いていlisp/emacs-lisp/package.elます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.