防止 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'
定义为 array
和 arrayref
(以及许多其他东西),但 LWP 似乎不理解数组的概念参数,即使我有这个参数的多个值,它们都将以相同的参数名称提交(?array=123&array=456&array=789
) - 所以这也不起作用。
大多数情况下,我想知道是否可以以某种方式(不修改模块源)阻止 LWP 在发出 POST 请求时自动转义这些字符。
谢谢。
I need to submit a HTTP POST
request to a certain URL, and I am required to specify a parameter name that can be interpreted as an array - like this:
parameter[]=123
However, no matter what I try, LWP is always escaping [] characters.
Here is sample code:
#!/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 ]);
Data submitted looks like this:
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
And I need it to look like this:
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
I have no control over remote application and can not influence anything, I simply have to specify a single parameter like this (as a parameter of an array, which it really isn't), and I need to find a way how to do this, without Perl escaping bracket characters.
I have tried defining 'array'
as array
and arrayref
(and many other things), but LWP does not seem to understand the concept of array parameters, even if I have multiple values for this parameter, they will all be submitted with same parameter name (?array=123&array=456&array=789
) - so that won't work either.
Mostly, I am wondering if I can somehow (short of modifying module sources) prevent LWP to automatically escape these characters when making a POST request.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您正在发送一条内容经过 form-urlencoded 的消息。尝试首先创建一个未编码的请求:
You are sending a message whose content is form-urlencoded. Try creating first an unencoded request:
覆盖
$URI::Escape::escapes
的部分内容,详见 我如何绕过 GET 请求的 LWP URL 编码? 也应该适用于此。Overriding parts of
$URI::Escape::escapes
as detailed in How may I bypass LWP's URL encoding for a GET request? should work for this too.覆盖方法 URI::_query::query_form ,从 HTTP::Request::Common::POST 调用。
Override the method URI::_query::query_form, called from HTTP::Request::Common::POST.