2013-02-06 57 views
13

Tôi đang thực hiện yêu cầu HTTP với Ruby bằng Net :: HTTP và tôi không thể tìm ra cách nhận tất cả các tiêu đề phản hồi.Nhận tiêu đề phản hồi từ yêu cầu HTTP Ruby

Tôi đã thử response.headerresponse.headers và không có gì hoạt động.

+0

Net/HTTP có API nổi tiếng là xấu. Nếu bạn đang sử dụng một cái khác, chẳng hạn như httpclient, 'response.header' sẽ chỉ hoạt động. –

+0

Bạn có ý nghĩa gì bởi xấu? Tại sao tôi muốn tránh nó? – BlackHatSamurai

+0

Bản thân thư viện không phải là xấu, nhưng API rất khó hiểu và không trực quan như bạn đã khám phá. Tôi luôn sử dụng httpclient hoặc thư viện trình bao bọc với nhiều tính năng hơn như HTTParty, Rest-Client, v.v. khi tôi có thể. –

Trả lời

36

Đối tượng phản hồi thực sự chứa các tiêu đề.

Xem "Net::HTTPResponse" để biết thêm thông tin.

Bạn có thể làm:

response['Cache-Control'] 

Bạn cũng có thể gọi each_header hoặc each trên đối tượng phản ứng để lặp qua các tiêu đề.

Nếu bạn thực sự muốn các tiêu đề bên ngoài của đối tượng phản ứng, gọi response.to_hash

2

Lưu ý rằng thư viện RestClient có hành vi mong đợi cho response.headers.

response.headers 
{ 
          :server => "nginx/1.4.7", 
          :date => "Sat, 08 Nov 2014 19:44:58 GMT", 
        :content_type => "application/json", 
        :content_length => "303", 
         :connection => "keep-alive", 
      :content_disposition => "inline", 
    :access_control_allow_origin => "*", 
      :access_control_max_age => "600", 
    :access_control_allow_methods => "GET, POST, PUT, DELETE, OPTIONS", 
    :access_control_allow_headers => "Content-Type, x-requested-with" 
} 
0

Câu trả lời Net::HTTPResponse chứa tiêu đề từ Net::HTTPHeader mà bạn có thể nhận được từ each_header phương pháp như đã nói bởi @Intrepidd đó sẽ trở lại một Enumerator như sau:

response.each_header 

#<Enumerator: #<Net::HTTPOK 200 OK readbody=true>:each_header> 
[ 
    ["x-frame-options", "SAMEORIGIN"], 
    ["x-xss-protection", "1; mode=block"], 
    ["x-content-type-options", "nosniff"], 
    ["content-type", "application/json; charset=utf-8"], 
    ["etag", "W/\"51a4b917285f7e77dcc1a68693fcee95\""], 
    ["cache-control", "max-age=0, private, must-revalidate"], 
    ["x-request-id", "59943e47-5828-457d-a6da-dbac37a20729"], 
    ["x-runtime", "0.162359"], 
    ["connection", "close"], 
    ["transfer-encoding", "chunked"] 
] 

Bạn có thể lấy băm thực tế sử dụng phương pháp to_h như sau:

response.each_header.to_h 

{ 
    "x-frame-options"=>"SAMEORIGIN", 
    "x-xss-protection"=>"1; mode=block", 
    "x-content-type-options"=>"nosniff", 
    "content-type"=>"application/json; charset=utf-8", 
    "etag"=>"W/\"51a4b917285f7e77dcc1a68693fcee95\"", 
    "cache-control"=>"max-age=0, private, must-revalidate", 
    "x-request-id"=>"59943e47-5828-457d-a6da-dbac37a20729", 
    "x-runtime"=>"0.162359", 
    "connection"=>"close", 
    "transfer-encoding"=>"chunked" 
} 
Các vấn đề liên quan