代码之家  ›  专栏  ›  技术社区  ›  Ωmega

如何获取完整的HTTP请求(非响应)头

  •  1
  • Ωmega  · 技术社区  · 8 年前

    我有这样一个简单的代码:

    use LWP::UserAgent;
    use HTTP::Cookies;
    use HTTP::Request;
    
    my $cookies = HTTP::Cookies->new();
    my $browser = LWP::UserAgent->new();
       $browser->agent(' ... ');    
       $browser->cookie_jar($cookies);   
    my $request = HTTP::Request->new();     
    my $response;                           
    my $url;                                
    my $referer;                                        
    
    $referer = '';
    $url = 'https:// ...'; # url #1
    $request->url($url);
    $request->method('GET');
    $request->header('Referer' => $referer);    
    $response = $browser->request($request);    
    print $response->request()->uri()     . "\n\n" .
          $response->headers()->as_string . "\n\n" .
          $response->content              . "\n\n";
    
    $referer = $response->request()->uri();
    $url = 'https:// ... '; # url #2
    $request->url($url);
    $request->method('GET');
    $request->header('Referer' => $referer);
    $response = $browser->request($request);
    print $response->request()->uri()     . "\n\n" .
          $response->headers()->as_string . "\n\n" .
          $response->content              . "\n\n";
    

    现在,我想查看完整的HTTP 请求报头 此外,不仅仅是响应头。

    我该怎么做?此代码中必须添加哪些内容?

    4 回复  |  直到 8 年前
        1
  •  3
  •   UncleCarl    8 年前

    我认为您的现有代码中几乎包含了它。您正在使用$response访问请求URI->请求()->uri()。->request()是您的HTTP::request对象。我相信您可以使用$响应->请求->标题->as\U字符串以获取所需内容。

        2
  •  1
  •   Borodin    8 年前
    print $response->request->as_string
    
        3
  •  1
  •   oalders    8 年前

    这将显示请求和响应。

    use LWP::UserAgent;
    use LWP::ConsoleLogger::Easy qw( debug_ua );
    
    my $browser = LWP::UserAgent->new();
    
    debug_ua( $browser );
    
        4
  •  0
  •   ikegami Gilles Quénot    8 年前

    $request->headers->as_string $response->request->headers->as_string 您会得到LWP传递给Net::HTTP的第一个和最后一个请求的标头吗 [1] ,但这些并不是Net::HTTP发送的内容。例如,Net::HTTP可以添加 Content-Length 收割台,a TE 标题和/或其他一些标题。

    HTTP没有记录它实际发送的头。您需要一个电线嗅探器(例如。 tcpdump )或调试代理(如Fiddler)。您还可以使用调试器或trace语句查看在Net::HTTP::方法中准备的请求 format_request . 然而,最方便的方法可能是包装Net::HTTP::方法的 format\u请求 .


    1. 除非初始请求被重定向,否则它们是相同的。要获取所有请求(和响应),可以使用:

      while ($response) {
         my $request = $response->request;
         ...
      
         $response = $response->previous;
      }