代码之家  ›  专栏  ›  技术社区  ›  simo

ruby会从响应中删除头吗?

  •  1
  • simo  · 技术社区  · 6 年前

    我直接从我的博客获取html内容:

    response = Net::HTTP.get_response(uri)
    
    respond_to do |format|
      format.html { render :text => response.body }
    end
    

    尽管在博客引擎(WordPress)上我添加了header Access-Control-Allow-Origin: * 我怎么注意到它没有在响应中传递。

    但是,如果我使用postman获取页面或直接在浏览器中查看页面,则可以看到页眉在那里。

    编辑

    我可以看到传递的其他头,例如:

    cache-control: no-cache, must-revalidate, max-age=0
    content-type: text/html; charset=UTF-8
    date: Tue, 24 Jul 2018 06:37:57 GMT
    expires: Wed, 11 Jan 1984 05:00:00 GMT
    

    知道吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Eric    6 年前

    如果要传递从要从其获取的主机提供服务的头,首先需要将博客中的响应保存在不同的变量名中我们称之为 blog_response (这是因为 response 是Rails控制器实例中预先存在的特殊方法名称。

    blog_response = Net::HTTP.get_response(uri)
    

    然后你需要从 博客回应 这样地:

    header_name, header_value = blog_response.each_header.find do |name, value| 
      name =~ /pattern-matching-a-header-name-i-care-about/i  #case insensitive regex matching recommended for http headers
    end
    

    然后,您需要在呈现响应之前在控制器中设置它们,例如:

    response.headers[header_name] = header_value
    
    respond_to do |format|
      format.html { render :text => blog_response.body }
    end
    

    本例显然只针对一个头,但是您可以通过在响应中迭代、匹配和设置多个头来复制它们,如下所示:

    blog_response.each_header.select do |name, value| 
      if name =~ /pattern-matching-header-names-i-care-about|some-other-pattern-i-care-about/i  #case insensitive regex matching recommended for http headers
        response.headers[name] = value
      end
    end
    

    如果要传递所有邮件头,请执行以下操作:

    blog_response.each_header do |name, value| 
      response.headers[name] = value
    end
    
    respond_to do |format|
      format.html { render :text => blog_response.body }
    end
    
        2
  •  4
  •   Gagan Gami    6 年前

    response.body 会把你的身体部分还给你的 header 部分您可以将响应转换为哈希并检查头,如下所示:

    > url = "https://stackoverflow.com/questions/51492025/does-ruby-strip-headers-from-response"
    > uri = URI.parse(url)
    > response = Net::HTTP.get_response(uri)
    #=> #<Net::HTTPOK 200 OK readbody=true> 
    > response.to_hash
    #=> {"cache-control"=>["private"], "content-type"=>["text/html; charset=utf-8"], "last-modified"=>["Tue, 24 Jul 2018 07:04:00 GMT"], "x-frame-options"=>["SAMEORIGIN"], "x-request-guid"=>["22a4b6b6-3039-46e2-b4de-c8af7cad6659"], "strict-transport-security"=>["max-age=15552000"], "content-security-policy"=>["upgrade-insecure-requests"], "accept-ranges"=>["bytes", "bytes"], "age"=>["0", "0"], "content-length"=>["31575"], "date"=>["Tue, 24 Jul 2018 07:04:46 GMT"], "via"=>["1.1 varnish"], "connection"=>["keep-alive"], "x-served-by"=>["cache-bom18221-BOM"], "x-cache"=>["MISS"], "x-cache-hits"=>["0"], "x-timer"=>["S1532415886.990199,VS0,VE280"], "vary"=>["Accept-Encoding,Fastly-SSL"], "x-dns-prefetch-control"=>["off"], "set-cookie"=>["prov=a7dfe911-76a1-f1c1-093b-3fc8fe79af65; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly"]}
    

    通过传递头名称,可以按如下方式访问特定头:

    > response['Cache-Control']
    #=> "private" 
    

    有关详细信息,请阅读: https://ruby-doc.org/stdlib-2.5.1/libdoc/net/http/rdoc/Net/HTTP.html

        3
  •  2
  •   Amadan    6 年前

    Net::HTTPResponse (那是你的 response )混入 Net::HTTPHeader . 因此,您可以得到一个单独的头 response['Access-Control-Allow-Origin'] ,对它们进行迭代 response.each_header ,甚至使用 response.to_hash .