Chuyển đến phần thân sau khi truy xuất url-đồng bộ


7

Tôi sử dụng url-retrieve-synchronouslyđể tải xuống một tệp JSON từ một máy chủ từ xa. Hàm này trả về một bộ đệm chứa toàn bộ nội dung của phản hồi, bao gồm các tiêu đề HTTP. Tuy nhiên, tôi chỉ quan tâm đến cơ thể.

Bây giờ, không cần phân tích cú pháp phản hồi HTTP theo cách thủ công, làm thế nào tôi có thể nhảy đến phần đầu của cơ thể? Tôi đã tìm thấy biến url-http-end-of-headers, nó hoạt động, nhưng nó hoàn toàn không được ghi lại và sử dụng nó có cảm giác bẩn bẩn. Có một API thích hợp cho mục đích này?

url  http 

Câu trả lời:


3

Đối với "API phù hợp", tôi nghĩ rằng câu trả lời ngắn hiện tại là "không" - trừ khi bạn sẵn sàng dựa vào thư viện bên ngoài. url-http-end-of-headersdường như là tốt như nó được, mặc dù nó không được đề cập trong Hướng dẫn lập trình URL cũng như dường như không được ghi lại trong nguồn emacs .


8

Vì có một dòng mới sau các tiêu đề HTTP, nên lựa chọn duy nhất tôi biết là sử dụng 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))

Chà, đó là cách phân tích cú pháp HTTP HTTP đối với tôi và tôi nghĩ url-http-end-of-headerslà thích hợp hơn với phương pháp này. Tôi đã thực sự hy vọng về một cái gì đó tương tự url-http-goto-body:(

3

Một lựa chọn cấp cao hơn để sử dụng url-http-end-of-headers, nhưng không có giấy tờ, là 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))

hoặc tương đương, trước Emacs 27 được biên dịch với hỗ trợ JSON gốc:

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

Những kết quả này trong:

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

Chức năng url-insert-file-contentskết thúc tốt đẹp các chức năng tốt hơn các tài liệu url-insert-buffer-contentsurl-insertvà do đó đi kèm với các goodies sau:

  1. Tự động tải theo mặc định.
  2. Tồn tại ít nhất là từ thời Emacs 21.
  3. Xử lý lỗi phản hồi HTTP đơn giản thông qua url-http-response-status.
  4. Giải mã dữ liệu.

FWIW, nó cũng đi kèm với sự đảm bảo được sử dụng bởi lisp/emacs-lisp/package.el.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.