防止LWP转义请求参数名称中的某些字符

时间:2011-03-31 11:29:47

标签: perl lwp

我需要向某个URL提交HTTP POST请求,我需要指定一个可以解释为数组的参数名称 - 如下所示:

parameter[]=123

然而,无论我尝试什么,LWP总是逃避[]角色。

以下是示例代码:

#!/usr/bin/perl

use strict;
use warnings;
use LWP;
use HTTP::Request::Common;
$|=1;

my $ua = LWP::UserAgent->new;
my $post_url = "http://192.168.1.1/something";

my $params = { };
$params->{something} = "abc";
$params->{'array[]'} = 123;
my $response = $ua->request(POST $post_url, [ $params ]);

提交的数据如下所示:

POST /something HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 192.168.1.1
User-Agent: libwww-perl/5.835
Content-Length: 29
Content-Type: application/x-www-form-urlencoded

array%5B%5D=123&something=abc

我需要它看起来像这样:

POST /something HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 192.168.1.1
User-Agent: libwww-perl/5.835
Content-Length: 25
Content-Type: application/x-www-form-urlencoded

array[]=123&something=abc

我无法控制远程应用程序并且不能影响任何东西,我只需要像这样指定一个参数(作为数组的参数,它实际上不是),我需要找到一种方法这样做,没有Perl转义括号字符。

我尝试将'array'定义为arrayarrayref(以及许多其他内容),但LWP似乎并不理解数组参数的概念,即使我有多个值对于此参数,它们都将使用相同的参数名称(?array=123&array=456&array=789)提交 - 因此也不会有效。

大多数情况下,我想知道我是否能以某种方式(不修改模块源)阻止LWP在发出POST请求时自动转义这些字符。

感谢。

3 个答案:

答案 0 :(得分:2)

您正在发送内容为form-urlencoded的邮件。尝试首先创建一个未编码的请求:

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => 'http://192.168.1.1/something');
$req->content('array[]=123&something=abc');
my $res = $ua->request($req);

答案 1 :(得分:1)

$URI::Escape::escapes中详述的{{1}}的覆盖部分也应该适用于此。

答案 2 :(得分:0)

覆盖从HTTP :: Request :: Common :: POST。

调用的方法URI::_query::query_form