2011-08-08 18 views
8

Dưới đây là những gì tôi tin là SOAP liên quan :: đang LiteSOAP :: Lite Tạo <c-gensym ..> làm thế nào để loại bỏ nó?

my $req3 = SOAP::Lite->new(
    readable => 1, 
    autotype => 0, 
    proxy => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor', 
); 

$req3->requestMessage(
    \SOAP::Data->new(
     name => 'item', 
     attr => { foo => '0' }, 
     value => \SOAP::Data->new(
      name => 'foo', 
      value => 1, 
     ), 
    ), 
); 

Nó tạo ra XML này

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<requestMessage> 
    <c-gensym9> 
    <item foo="0"> 
     <foo>1</foo> 
    </item> 
    </c-gensym9> 
</requestMessage> 
</soap:Body> 

Tôi không thể hiểu tại sao <c-gensym9 /> được lồng bên trong <requestMessage> nhưng tôi không cần phải ở đó. Bất cứ ai có thể giải thích lý do tại sao nó có? và làm thế nào tôi có thể viết lại mã để nó không?

Trả lời

2

Look ma, không gensym

$req3->requestMessage(
    ## \SOAP::Data->new(## this makes gensym 
    SOAP::Data->new(## no refref, no gensym 
     name => 'item', 
     attr => { foo => '0' }, 
     value => \SOAP::Data->new(
      name => 'foo', 
      value => 1, 
     ), 
    ), 
); 

xem thêm http://perlmonks.com/?node_id=906383

0

Thật không may, mã mà chúng tôi thực sự cần giúp trả lời là mã bạn (hoàn toàn không chủ ý) bị loại trừ là ... # noisy SOAP::Data stuff.

SOAP :: Lite có thể khá gensym hạnh phúc. Nó sử dụng thẻ này bất cứ khi nào nó không hiểu cấu trúc dữ liệu đầy đủ mà nó đang cố gắng tạo ra. Vì vậy, trong ví dụ của bạn, đối tượng SOAP :: Data xác định thẻ requestMessage dường như được truyền qua một mảng khi không được mong đợi, do đó cần có một thẻ trung gian chưa được đặt tên (c-gensym5).

Với những gì được tạo ở trên, có vẻ như bạn đang cố chuyển một mảng bằng một mã băm [ { data } ]? Bất cứ khi nào SOAP :: Lite cảm thấy có một tên nên có mặt (tức là [ no name for hash --> { data } ]) khi không có tên nào được cung cấp, nó sẽ "gensym" để làm rõ đầu ra. Nó cũng có thể là SOAP :: Lite đang mong đợi một cái gì đó để được thoát mà không phải là thoát.

Một bài đăng rất chính thức ở soaplite.com được gọi là How do you turnoff the blasted c-gensym elements? không may là không hữu ích cho chính nó (vì các liên kết đã chết) nhưng cách quay lại máy có thể trợ giúp.

Tôi hy vọng điều này sẽ hữu ích. Xin lỗi tôi không thể cụ thể hơn!

+0

vâng tôi thấy bài đó ... tiếc là nó là liên kết được chết ... do đó, nó vô dụng. – xenoterracide

+0

@JT đã cập nhật mã của tôi thành một ví dụ hoàn chỉnh – xenoterracide

+0

Các liên kết trong bài viết đó có thể được tìm thấy tại: http://www.techrepublic.com/article/a-hands-on-tour-of-soaplite/1045078 và http: //web.archive.org/web/20070308122644/http://www.majordojo.com/archives/2003_04.html – Ether

Các vấn đề liên quan