HTTP :: Request和literal%2B

时间:2011-03-22 18:41:37

标签: perl httprequest lwp

我正在创建一个脚本,将一些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文字。

提前致谢

韦尔奇

3 个答案:

答案 0 :(得分:4)

您需要转义内容中的所有不安全字符,如下所示:

use URI::Escape;
$ret->content("xml_request=".uri_escape($XML));

答案 1 :(得分:3)

您错误地构建了application/x-www-form-urlencoded文档。正确构造它的最简单方法是直接使用HTTP::Request::CommonPOST

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

答案 2 :(得分:-1)

作为旁注,“+”不需要URL编码,因此我不清楚为什么要在XML中对其进行编码。除此之外

我认为如果你在它的构造函数中传递HTTP :: Request一个预先格式化的字符串,它就不会触及数据。

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