2011-03-22 2 views
2

일부 스크립트를 다른 서버에 POST하는 스크립트를 만들고 있지만 플러스 (+) 문제가 있습니다. 당신이 값이 "WS + suHG7Xqk01RaIxm2L/W1L을"받아 봐 값 문자열 %의 2B와 다른 서버를 가지고있는 속성을 코드에서 볼 수 있듯이HTTP :: Request 및 리터럴 % 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 리터럴을 보낼 수 있습니까? 그래서 URL 인코딩을 필요로하지 않습니다

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

답변

4

는이 같은 내용의 모든 안전하지 않은 문자를 이스케이프 할 필요가 XML에서 인코딩하는 이유가 확실하지 않습니다. 그건 제쳐두고

내가 HTTP를 전달하면 생각 : : 그것의 생성자에서 서식있는 문자열을 요청하면 데이터를 건드리지 않을 것입니다.

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

안녕하세요 유진하게 될 겁니다, 내가에만 변경 작업이 $ RET-> 컨텐츠 (uri_escape를 ("xml_request = $ XML")) ; $ ret-> content (xml_request = uri_escape ($ XML)); 그리고 위대한 작품. – Welcho

+0

@ Welcho, @ ikegami가 수정되었습니다. –

-1

보조 노트, '+'로 : 사전에

덕분에

웰치

+0

감사합니다 vicTROLLA, 시간 내 주셔서 감사합니다. – Welcho

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

+1 적절한 방법을 가르치기 위해 – daxim

+0

감사합니다 y 그것을 테스트합니다. – Welcho

+0

@ daxim, 나는 그것이 "적절한 방법"이라는 것에 대해 모른다. 편리하고 간단하기 때문에 사용합니다. 또한 'uri_escape'보다 오용이 적습니다. – ikegami