2011-03-22 204 views
2

我正在制作一个脚本,将一些XML POST到另一台服务器,但我有一个加singn(+)的问题。这里是我的代码:HTTP ::请求和文字%2B

#!/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和其他服务器看到recive值“WS + suHG7Xqk01RaIxm2L/W1L”。

如何发送%2B字面值。

在此先感谢

韦尔奇

回答

4

你需要逃避所有不安全的字符像这样的内容:

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

尤金嗨结束了,它的工作原理我只能改变:这$ ret->内容(uri_escape( “xml_request = $ XML”)) ;到$ ret-> content(xml_request = uri_escape($ XML));并且效果很好。 – Welcho 2011-03-22 19:35:45

+0

@ Welcho,@ ikegami更正。 – 2013-12-12 11:37:54

-1

作为一个侧面说明,“+”不需要URL编码,以便我不清楚你为什么在XML中对它进行编码。除了

我想如果你通过HTTP ::请求一个预格式化的字符串,它的构造函数将不会触及数据。

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

谢谢vicTROLLA,我赞赏你的时间。 – Welcho 2011-03-22 19:36:51

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 
+0

用于教学的适当方式 – daxim 2011-03-23 14:58:32

+0

谢谢你会测试它。 – Welcho 2011-03-23 17:27:20

+0

@daxim,我不知道它是“合适的方式”。我使用它,因为它很方便和简单。它比'uri_escape'更不容易被误用。 – ikegami 2011-03-23 17:32:24