从Curb获取响应标头

Mik*_*loy 12 ruby curb

我打算从Ruby on Rails应用程序调用:

c = Curl::Easy.http_post("https://example.com", json_string_goes_here) do |curl|
  curl.headers['Accept'] = 'application/json'
  curl.headers['Content-Type'] = 'application/json'
  curl.headers['Api-Version'] = '2.2'
end
Run Code Online (Sandbox Code Playgroud)

响应应该有自定义标头:

X-Custom1 : "some value"
X-Custom2 : "another value"
Run Code Online (Sandbox Code Playgroud)

如何迭代响应头以将值与我期望的值进行比较?

the*_*Man 33

使用Curl :: Easy,header_str您可以作为字符串访问返回的标头.从文档:

返回上一次调用的响应头以执行.这由默认的on_header处理程序填充 - 如果您提供自己的标头处理程序,则此字符串将为空.

为了测试这个,我使用以下方法打开内置Gem服务器:

gem server
Run Code Online (Sandbox Code Playgroud)

这里有一些代码来测试这个:

curl = Curl::Easy.http_get('http://0.0.0.0:8808')
curl.header_str
=> "HTTP/1.1 200 OK \r\nDate: 2013-01-10 09:07:42 -0700\r\nContent-Type: text/html\r\nServer: WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10)\r\nContent-Length: 62164\r\nConnection: Keep-Alive\r\n\r\n"
Run Code Online (Sandbox Code Playgroud)

捕获响应,并将剩余的字符串分解为哈希,使其更易于使用,这很简单:

http_response, *http_headers = curl.header_str.split(/[\r\n]+/).map(&:strip)
http_headers = Hash[http_headers.flat_map{ |s| s.scan(/^(\S+): (.+)/) }]

http_response # => "HTTP/1.1 200 OK"

http_headers 
=> {
                  "Date" => "2013-01-10 09:07:42 -0700",
          "Content-Type" => "text/html",
                "Server" => "WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10)",
        "Content-Length" => "62164",
            "Connection" => "Keep-Alive"
    }
Run Code Online (Sandbox Code Playgroud)

在Pry再次测试:

[27] (pry) main: 0> curl = Curl::Easy.http_get('http://www.example.com')
#<Curl::Easy http://www.example.com>
[28] (pry) main: 0> curl.header_str
"HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/\r\nServer: BigIP\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\n\r\n"
[29] (pry) main: 0> http_response, *http_headers = curl.header_str.split(/[\r\n]+/).map(&:strip)
[
    [0] "HTTP/1.0 302 Found",
    [1] "Location: http://www.iana.org/domains/example/",
    [2] "Server: BigIP",
    [3] "Connection: Keep-Alive",
    [4] "Content-Length: 0"
]
[30] (pry) main: 0> http_headers = Hash[http_headers.flat_map{ |s| s.scan(/^(\S+): (.+)/) }]
{
          "Location" => "http://www.iana.org/domains/example/",
            "Server" => "BigIP",
        "Connection" => "Keep-Alive",
    "Content-Length" => "0"
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,你应该接受这个.另一方面,通过不为您解析标题,一个糟糕的用户体验限制是什么. (3认同)
  • @theTinMan - 我认为他是说如果这是路边的一部分就好了,这样每个到达这里的人都不会一遍又一遍地编写相同的代码......你的回答很好;) (2认同)