【问题标题】:How to get full HTTP request (not response) headers如何获取完整的 HTTP 请求(而非响应)标头
【发布时间】:2018-08-08 21:09:49
【问题描述】:

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

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 请求标头,而不仅仅是响应标头。

我该怎么做?这段代码需要添加什么?

【问题讨论】:

  • 此外,在重定向的情况下,单个 LWP::UserAgent::request 调用最终可能会发送多个 HTTP 请求。

标签: perl http-headers httprequest httpresponse user-agent


【解决方案1】:

我认为您几乎可以在现有代码中使用它。您正在使用 $response->request()->uri() 访问请求 URI。 ->request() 是您的 HTTP::Request 对象。我相信你可以使用 $response->request->headers->as_string 来得到你想要的。

【讨论】:

  • 请注意,这并不显示实际发送的标头,只是 LWP 传递给 Net::HTTP 的内容。
  • 由于所有解决方案(在此评论时可用)导致相同或相似的输出,我奖励第一个答案。
【解决方案2】:
print $response->request->as_string

【讨论】:

    【解决方案3】:

    这将向您显示请求和响应。

    use LWP::UserAgent;
    use LWP::ConsoleLogger::Easy qw( debug_ua );
    
    my $browser = LWP::UserAgent->new();
    
    debug_ua( $browser );
    

    【讨论】:

    • 请注意,这并不显示实际发送的标头,只是 LWP 传递给 Net::HTTP 的内容。
    【解决方案4】:

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

    Net::HTTP 不会记录它实际发送的标头。为此,您将需要一个有线嗅探器(例如 tcpdump)或调试代理(例如 Fiddler)。您还可以使用调试器或跟踪语句来查看在 Net::HTTP::Methods 的format_request 中准备的请求。然而,最方便的方法可能是包装 Net::HTTP::Methods 的 format_request


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-09
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2011-09-25
      • 2014-11-15
      相关资源
      最近更新 更多