我正在创建一个脚本,将一些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文字。
提前致谢
韦尔奇
答案 0 :(得分:4)
您需要转义内容中的所有不安全字符,如下所示:
use URI::Escape;
$ret->content("xml_request=".uri_escape($XML));
答案 1 :(得分:3)
您错误地构建了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
答案 2 :(得分:-1)
作为旁注,“+”不需要URL编码,因此我不清楚为什么要在XML中对其进行编码。除此之外
我认为如果你在它的构造函数中传递HTTP :: Request一个预先格式化的字符串,它就不会触及数据。
my $ret = HTTP::Request->new('POST', $XMLurl, undef, "xml_request=".$XML);