2011-03-22 206 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