【问题标题】:Adding headers to a LWP post in Perl在 Perl 中向 LWP 帖子添加标题
【发布时间】:2014-02-13 15:28:17
【问题描述】:

我已经接管了一些 perl 代码,并被要求在发生的 LWP 帖子中添加一个 keep-alive 标头。

Google 告诉我如何针对某些设置执行此操作,但我看不到如何针对此代码的编写方式执行此操作。我能找到的所有信息都基于创建 LWP 对象,然后创建 POST 和参数,然后添加标头,然后实际发布请求,但是在我必须处理的代码中,创建 POST,添加标头和发送都在一行中:

my $ua = LWP::UserAgent->new;
my $response = $ua->post( $URL, ['parm1'=>'val1']);

如何/在哪里可以在此设置中添加标题,还是需要根据我找到的示例重新编写?

【问题讨论】:

  • 我建议重写。这样一来,它就更易于维护,您可以根据需要添加任何级别的控制。
  • 如果我可以避免它,我宁愿 - 代码已经稳定了一段时间,将在未来六个月内完全被新系统取代 - 我刚刚被要求添加这个一个标题可以在过渡期间加快速度,并且如果可能的话,不想通过重写来冒新问题的风险!

标签: perl header lwp


【解决方案1】:

LWP::UserAgent 页面告诉您如何执行此操作。您将在用户代理对象上设置处理程序request_prepare。这将在 request 对象发布之前传递给您。

实际上,您在键 'Content' 之前作为键值对列表放置的任何内容,后跟要发布的结构,都将转换为标题,每个 HTTP::Request::Common::POST

 $ua->post( $URL, keep_alive => 1, Content => ['parm1'=>'val1']);

或者不带内容标签,如果先放结构,可以在后放header键值对:

 $ua->post( $URL, ['parm1'=>'val1'], keep_alive => 1 );

【讨论】:

  • 这是错误的。添加keep_alive => 1 只会生成一个与持久连接无关的“Keep-Alive:1”标头,它应该在其中执行“Connection:keep-alive”。只需创建一个 tcpdump,您就会看到每个 HTTP 请求都有自己的 TCP 连接,这与 keep alive 应该做的相反。
【解决方案2】:

他们是否真的要求您仅添加 keep-alive 标头,或者他们是否要求您支持 keep-alive,例如同一 TCP 连接中的多个 HTTP 请求。在后一种情况下,您应该使用(根据 LWP::UserAgent 的文档):

my $ua = LWP::UserAgent->new( keep_alive => 10 );
$ua->get('http://foo.bar/page1');
$ua->get('http://foo.bar/page2');   # reuses connection from previous request

在这种情况下,它将最多同时打开 10 个连接。如果您只对同一个站点进行请求,您也可以将其设置为 1,以便它为所有请求重用相同的 TCP 连接。

Keep-Alive 标头没有任何意义,keep_alive => 1 在用户代理中所做的是设置连接缓存并添加“Connection: keep-alive”标头(HTTP/1.1 keep-alive 是隐含的,因此不需要为 HTTP/1.1 请求添加标头)。

【讨论】:

  • 他们让我添加 keep-alive 标头。我不知道他们是否打算支持keep-alive,但是在遵循@Axeman 的建议之后,它似乎更快。我会问他们是否真的是这个意思:)
  • 不,@Axeman 错了。只需执行一次 tcpdump,您就会发现它不会为多个请求重用 TCP 连接。
  • 好的,@Axeman 并没有真正错。他的代码添加了一个 Keep-Alive 标头,这是您所要求的,但这可能不是他们给您的任务(例如,使用 keep-alive 重用连接)。它所做的只是添加一个没人使用的标题。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多