HTTP :: Запрос и литерал% 2B - PullRequest
2 голосов
/ 22 марта 2011

Я делаю скрипт, который размещает XML на другой сервер, но у меня проблемы с плюсом singn (+). Вот мой код:

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $XML = qq|
<?xml version="1.0" encoding="UTF-8"?>
<ServiceAddRQ>
<Service code="Ws%2BsuHG7Xqk01RaIxm2L/w1L">
<ContractList>
<Contract>
<Name>CGW-TODOSB2B</Name>
</Contract>
</ContractList>
</Service>
</ServiceAddRQ>
|;

utf8::encode($XML);


my $ua = LWP::UserAgent->new;
$ua->timeout(120);

my $ret = HTTP::Request->new('POST', $XMLurl);
$ret->content_type('application/x-www-form-urlencoded'); 
$ret->content("xml_request=$XML");

my $response = $ua->request($ret);

Как видно из кода атрибута, строка значения имеет% 2B, а другой сервер получает значение "Ws + suHG7Xqk01RaIxm2L / w1L".

Как я могу отправить% 2B буквальный.

Заранее спасибо

Welch

Ответы [ 3 ]

4 голосов
/ 22 марта 2011

Вам необходимо экранировать все небезопасные символы в контенте, например:

use URI::Escape;
$ret->content("xml_request=".uri_escape($XML));
3 голосов
/ 23 марта 2011

Вы неправильно создаете документ application/x-www-form-urlencoded. Самый простой способ построить его правильно - это использовать HTTP :: Request :: Common POST либо напрямую

use HTTP::Request::Common qw( POST );
my $request = POST($XMLurl, [ xml_request => $XML ]);
my $response = $ua->request($request);

или косвенно

my $response = $ua->post($XMLurl, [ xml_request => $XML ]);

Тело запроса будет

Ws%252BsuHG7Xqk01RaIxm2L/w1L

вместо

Ws%2BsuHG7Xqk01RaIxm2L/w1L

так что в итоге вы получите

Ws%2BsuHG7Xqk01RaIxm2L/w1L

вместо

Ws+suHG7Xqk01RaIxm2L/w1L
0 голосов
/ 22 марта 2011

В качестве примечания, «+» не требует кодирования URL, поэтому я не понимаю, почему вы кодируете его в своем XML.Помимо этого

Я думаю, что если вы передадите HTTP :: Request предварительно отформатированную строку в своем конструкторе, это не коснется данных.

my $ret = HTTP::Request->new('POST', $XMLurl, undef, "xml_request=".$XML); 
...