Предотвращение экранирования LWP определенных символов в имени параметра запроса - PullRequest
0 голосов
/ 31 марта 2011

Мне нужно отправить запрос HTTP POST на определенный URL, и мне необходимо указать имя параметра, которое можно интерпретировать как массив - например, так:

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

Я не имею никакого контроля над удаленным приложением и не могу на что-либо повлиять, я просто должен указать один такой параметр (как параметр массива, который на самом деле не't), и мне нужно найти способ сделать это, не используя Perl без экранирующих символов в скобках.

Я пытался определить 'array' как array и arrayref (и многие другие),но LWP, похоже, не понимает концепцию параметров массива, даже если у меня есть несколько значений для этого параметра, все они будут отправлены с одинаковым именем параметра (?array=123&array=456&array=789) - так что это тоже не сработает.

В основном мне интересно, могу ли якаким-то образом (если не считать изменения в модулях исходного кода) мешать LWP автоматически экранировать эти символы при выполнении запроса POST.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Вы отправляете сообщение, содержимое которого имеет форму 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 голос
/ 26 февраля 2014

Переопределение частей $URI::Escape::escapes, как подробно описано в Как я могу обойти кодировку URL LWP для запроса GET? должно работать и для этого.

0 голосов
/ 31 марта 2011

Переопределить метод URI :: _ query :: query_form , вызываемый из HTTP :: Request :: Common :: POST.

...