2012-03-08 3 views
0

에 HTTP POST를 통해 전송 된 XML 문서 수신 :내가 HTTP POST 나에게 전송되는 XML 문서가 펄

<?xml version="1.0" encoding="UTF-8" ?> 
    <DeliveryNotification eventType="newMessage"> 
    <requestUid>sms9676187</requestUid> 
    <sentMessageUid>sms29282896</sentMessageUid> 
    .... 
    </DeliveryNotification> 

내가 다음 PARAM를 사용하여 펄 스크립트에 receieve을() 서브 루틴 :

나는 결과를 덤퍼 때
#!/usr/bin/perl -w 
use strict; 
use CGI qw/param/; 
use Data::Dumper; 

my @xml = param(); 
warn Dumper(@xml); 

와 나는 얻을 :이 실행될 때마다

$VAR1 = '<?xml version'; 

'='시에 파일을 깰 것으로 보인다 gn. 테스트 할 첫 번째 eqauls 기호를 제거하면 다음 번에 깨지기 시작합니다. 이것은 equals를 이스케이프 처리하여 데이터를 보내는 쪽에서 만 해결할 수 있습니까? 아니면 Perl에서 할 수 있습니까?

+0

* 데이터는 어떻게 전송되고 있습니까? HTTP 요청의 내용 유형은 무엇입니까? 요청 본문은 어떻게 생겼습니까? – Quentin

+0

XML은'param()'의 결과에서 어떻게 끝나나요? 그 결과를 배열에 저장하려는 이유는 무엇입니까? 반환 된 XML을 가지고 무엇을하고 싶습니까? XML 파서를 사용하여 내용을 조사해야합니다. – reinierpost

+0

전송되는 데이터는 게시 쿼리와 비슷하지만 "id = 22111 & name = xxx"가 아닌 XML 문서이므로 전체 XML 문서의 문자열입니다. 스칼라에 저장할 때 배열이 "1"이되기 때문에 배열에 저장 해요. 받은 데이터가 완전하고 = 기호 뒤에 잘리지 않으면 XML 파서를 사용합니다. –

답변

0

:

#!env perl 
use CGI qw(:standard); 
use Data::Dumper; 
my @xml = param(); 
warn Dumper(@xml); 

param()을 매개 변수의 URL 인코딩 목록에서 기대 URL 인코딩 및 HTTP POST에 대한 추가 정보를 원하시면

은 보라 쿼리 문자열 (GET 또는 POST) 및 목록 컨텍스트에서 매개 변수의 이름을 반환합니다.

쿼리 문자열의 원시 데이터를 원하는 경우 (양식 데이터를 처리하지 않을 것으로 예상되는 경우) query_string()을 사용하고 대신 GET 요청을 통해 XML을 전송하십시오.

You can read the raw POST data via STDIN without using CGI, but there are caveats.

+0

예, 제가 가지고있는 전체 코드와 조금 비슷합니다. 전체 스크립트를 보여주기 위해 제 질문에 더 많은 것을 추가했습니다. query_string()은 $ ENV {QUERY_STRING}을 (를) 의미합니까? query_string() 하위를 찾을 수 없습니다. –

+0

'CGI를 사용합니다. qw (query_string); –

+0

아 완벽한 곳입니다! 감사! query_string()으로 모든 것을 얻으십시오. –

-1

많은 코드를 제공하지 않으므로 문제가 무엇인지 추측 할 수 있습니다. 나는 문제를 보내는 측에서 '추측하고있다'. HTTP POST의 모든 데이터는 URL 인코딩되어야합니다. 그리고 '='는 문제가 될 수있는 인코딩해야하는 안전하지 않은 문자입니다. 스크립트 같은 것을 보인다 내가 그것을 가지고 enter link description here

+0

조금 더 코드를 추가했습니다. 또한 PHP 스크립트를 사용하여 XML의 정확한 HTTP POST를 보내면 모든 데이터가 검색되므로 PERL 측에 있다고 생각합니다. –

+1

아니요, HTTP POST의 모든 데이터가 인코딩 된 URL이 아니어야합니다. 이것은 Content-Type 응용 프로그램/x-www-form-urlencoded에만 해당하지만 질문에는 application/xml이 표시됩니다. – daxim

1

사용 param('POSTDATA').

#!/usr/bin/perl -T 
use strict; 
use warnings FATAL => 'all'; 
use CGI qw(); 
my $cgi = CGI->new; 
my $xml = $cgi->param('POSTDATA'); 
+0

그 중 하나를 시도하고 방금 $ xml의 값에 대해 "undef"를 얻었습니다. –

+0

그건 좋지 않습니다. 나는 버그를 신청했다. https://rt.cpan.org/Ticket/Display.html?id=75628 – daxim