代码之家  ›  专栏  ›  技术社区  ›  Nakilon earlonrails

如何在不读取其余HTTP资源的情况下读取标头?

  •  0
  • Nakilon earlonrails  · 技术社区  · 7 年前

    我确信当我这样做的时候:

    http = Net::HTTP.start uri.host, uri.port
    request = Net::HTTP::Get.new uri
    response = http.request request
    

    response.body .

    但要么是我一直错了,要么是我现在访问的服务器有问题 http.request

    [Net::HTTP debug] opening connection to v.redd.it:80...  
    [Net::HTTP debug] opened  
    [Net::HTTP debug] <- "GET /6otzwem1c7721/DASH_9_6_M?source=fallback HTTP/1.1\r\nAccept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3\r\nAccept: */*\r\nUser-Agent: Ruby\r\nHost: v.redd.it\r\nConnection: close\r\n\r\n"  
    [Net::HTTP debug] -> "HTTP/1.1 200 OK\r\n"  
    [Net::HTTP debug] -> "Last-Modified: Sat, 29 Dec 2018 11:25:57 GMT\r\n"  
    [Net::HTTP debug] -> "ETag: \"662291aec20b252aaebcf54c3b1827af-42\"\r\n"  
    [Net::HTTP debug] -> "Content-Type: video/mp4\r\n"  
    [Net::HTTP debug] -> "Cache-Control: public, max-age=604800, s-maxage=86400, must-revalidate\r\n"  
    [Net::HTTP debug] -> "Accept-Ranges: bytes\r\n"  
    [Net::HTTP debug] -> "Content-Length: 218756120\r\n"  
    [Net::HTTP debug] -> "Accept-Ranges: bytes\r\n"  
    [Net::HTTP debug] -> "Date: Sun, 30 Dec 2018 13:44:21 GMT\r\n"  
    [Net::HTTP debug] -> "Via: 1.1 varnish\r\n"  
    [Net::HTTP debug] -> "Connection: close\r\n"  
    [Net::HTTP debug] -> "X-Served-By: cache-fra19120-FRA\r\n"  
    [Net::HTTP debug] -> "X-Cache: HIT\r\n"  
    [Net::HTTP debug] -> "X-Cache-Hits: 0\r\n"  
    [Net::HTTP debug] -> "X-Timer: S1546177461.284280,VS0,VE0\r\n"  
    [Net::HTTP debug] -> "Server: snooserv\r\n"  
    [Net::HTTP debug] -> "Vary: Origin\r\n"  
    [Net::HTTP debug] -> "\r\n"  
    [Net::HTTP debug] reading 218756120 bytes... 
    

    [159, 168] in /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/response.rb
       159:   def reading_body(sock, reqmethodallowbody)  #:nodoc: internal use only
       160:     @socket = sock
       161:     @body_exist = reqmethodallowbody && self.class.body_permitted?
       162:     begin
       163:       yield
    => 164:       self.body   # ensure to read body
       165:     ensure
       166:       @socket = nil
       167:     end
       168:   end
    (byebug) where
    --> #0  Net::HTTPResponse.reading_body(sock#Net::BufferedIO, reqmethodallowbody#TrueClass) at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/response.rb:164
        #1  Net::HTTP.transport_request(req#Net::HTTP::Get) at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http.rb:1445
        #2  Net::HTTP.request(req#Net::HTTP::Get, body#NilClass, &block#NilClass) at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http.rb:1407
        #3  block in Net::HTTP.block in request(req#Net::HTTP::Get, body#NilClass, &block#NilClass) at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http.rb:1400
        #4  Net::HTTP.start at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http.rb:853
        #5  Net::HTTP.request(req#Net::HTTP::Get, body#NilClass, &block#NilClass) at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http.rb:1398
    

    是服务器的错吗?红宝石断层?或者,如果我想在不加载整个资源的情况下获取头数据,我应该使用其他方法吗?

    Net::HTTP .

    1 回复  |  直到 7 年前
        1
  •  0
  •   Marcin Kołodziej    7 年前

    根本不关心身体:

    HEAD 而不是 GET :

    uri = URI('http://example.com')
    http = Net::HTTP.start uri.host, uri.port 
    request = Net::HTTP::Head.new uri
    response = http.request request
    response.body
    # => nil
    

    将块与 net/http 将允许您在身体实际加载之前钩住:

    uri = URI('http://example.com')
    res = nil
    
    Net::HTTP.start(uri.host, uri.port) do |http|
      request = Net::HTTP::Get.new uri
    
      http.request request do |response|
        res = response
        break
      end
    end
    
    res
    # => #<Net::HTTPOK 200 OK readbody=false> 
    res['Content-Type']
    # => "text/html; charset=UTF-8"
    
    推荐文章