2012-03-07 6 views
5

Tôi đang cố gắng gửi RAW xml đến một dịch vụ web thông qua PHP và SoapClient. Vấn đề là khi tôi mã hóa XML của tôi nó thay đổi thứ tự của các phần tử trong XML được chuyển đổi thành một mảng kết hợp.Gửi XML thô qua yêu cầu SoapClient của PHP

// Initialize the Soap Client: 
$this->_transactionServicesClient = new SoapClient($soapWSDLUrl); 

Làm cách nào hoặc cách tốt nhất để gửi XML sau làm chuỗi cho SoapClient của tôi là gì?

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.micros.com/pos/les/TransactionServices"> 
    <SOAP-ENV:Body> 
     <ns1:PostTransaction> 
      <ns1:REQ> 
       <ns1:RequestHeader> 
        <ns1:InterfaceVersion>3.0.7</ns1:InterfaceVersion> 
        <ns1:ClientName>TRANS_SERVICES</ns1:ClientName> 
       </ns1:RequestHeader>  
       <ns1:CheckDetailEntries> 
        <ns1:MenuItem> 
         <ns1:ReferenceEntry>Pizza4</ns1:ReferenceEntry> 
         <ns1:Count>1</ns1:Count> 
         <ns1:Price>10.00</ns1:Price> 
         <ns1:ItemNumber>112001</ns1:ItemNumber> 
         <ns1:PriceLevel>1</ns1:PriceLevel> 
         <ns1:Seat xsi:nil="true"/> 
        </ns1:MenuItem> 
       </ns1:CheckDetailEntries> 
       <ns1:CheckHeaderRequest> 
        <ns1:CheckId>03:21:05.050505</ns1:CheckId> 
        <ns1:GuestCount>1</ns1:GuestCount> 
        <ns1:GuestInformation> 
        <ns1:ID>001</ns1:ID> 
        <ns1:FirstName>xxx</ns1:FirstName> 
        <ns1:LastName>xxx</ns1:LastName> 
        <ns1:Address1>xxx Rd</ns1:Address1> 
        <ns1:Address2>xx</ns1:Address2> 
        <ns1:Address3>xx</ns1:Address3> 
        <ns1:PhoneNum>xx</ns1:PhoneNum> 
        <ns1:UserText1>None</ns1:UserText1> 
        <ns1:UserText2>None</ns1:UserText2> 
        <ns1:UserText3>None</ns1:UserText3> 
        <ns1:GUID></ns1:GUID></ns1:GuestInformation> 
       </ns1:CheckHeaderRequest> 
       <ns1:OrderTypeNumber>1</ns1:OrderTypeNumber> 
      </ns1:REQ> 
     </ns1:PostTransaction> 
    </SOAP-ENV:Body>   
</SOAP-ENV:Envelope> 

Cập nhật/Độ phân giải: Đây là mã tôi đã sử dụng để mở rộng khách hàng SOAP và gửi Soap Envelope liệu của tôi: My answer below

+0

Tôi nhầm lẫn - bạn có gửi XML đó đến dịch vụ SOAP và nó không được phân tích cú pháp hoặc bạn có XML mà bạn muốn gửi bên trong thông báo SOAP không? – enygma

+0

Tôi có XML tôi muốn gửi trong thông điệp xà phòng. Khi tôi gửi dữ liệu được mã hóa trong một mảng kết hợp, các nút sẽ mất trật tự ban đầu của chúng để phá vỡ yêu cầu. Một ví dụ: Inside CheckDetailEntries bạn có thể có các thẻ MenuItem hoặc Condiment. Nhưng để kết hợp Condiments với MenuItems, chúng phải theo một thứ tự nhất định bị mất khi tôi mã hóa XML. Vì vậy, tôi chỉ cần gửi chuỗi XML đến phương thức PostTransaction để xử lý. – Fostah

+0

Có cách nào khác để bạn có thể liên kết chúng không? Dựa vào thứ tự của XML đến dường như có một chút mong manh với tôi ... – enygma

Trả lời

7

Cập nhật/Độ phân giải: Đây là mã tôi đã sử dụng để mở rộng khách hàng SOAP và gửi nguyên Soap Envelope tôi

Dưới đây là cách tôi mở rộng SoapClient:

<?php 
class MySoapClient extends SoapClient { 

    function __construct($wsdl, $options) { 
     parent::__construct($wsdl, $options); 
     $this->server = new SoapServer($wsdl, $options); 
    } 
    public function __doRequest($request, $location, $action, $version) 
    { 
     $result = parent::__doRequest($request, $location, $action, $version); 
     return $result; 
    } 
    function __myDoRequest($array,$op) { 
     $request = $array; 
     $location = 'http://xxxxx:xxxx/TransactionServices/TransactionServices6.asmx'; 
     $action = 'http://www.micros.com/pos/les/TransactionServices/'.$op; 
     $version = '1'; 
     $result =$this->__doRequest($request, $location, $action, $version); 
     return $result; 
    } 
} 

// To invoke my new custom method with my Soap Envelope already prepared. 
$soapClient = new MySoapClient("http://xxxx:xxxx/TransactionServices/TransactionServices6.asmx?WSDL", array("trace" => 1)); 
$PostTransaction = $soapClient->__myDoRequest($orderRequest,$op); 
?> 

Cũng được đăng trên pastie.org: http://pastie.org/3687935 trước khi tôi chuyển câu trả lời này.

+4

Bạn vừa chuyển chuỗi XML của mình thành $ orderRequest? – fibono

4

Đối với mục đích thử nghiệm, bạn có thể phân lớp SoapClient và ghi đè phương thức __doRequest - nó nhận được XML được tạo ra và bạn có thể xử lý trước nó.

Nhưng tốt hơn hãy tìm những gì đang xảy ra với mã hóa XML. Bạn có thể sử dụng các cá thể SoapVar và SoapParam để chỉ định đối tượng chính xác cho đối tượng phải được biểu diễn. Những đã cứu sống tôi khi namespace phải được

+0

Điều đang xảy ra là khi XML của tôi đang được mã hóa thành một mảng kết hợp, nó mất thứ tự của các phần tử bên trong CheckDetailEntries. Trong XML của tôi, tôi có MenuItem, Condiment, MenuItem, Condiment. Nhưng khi XML được chuyển đổi, nó nhóm [MenuItems] [0] và [MenuItems] [1] sau đó khi giải mã làm cho MenuItem, MenuItem, Condiment, Condiment làm cho cả hai loại gia vị được liên kết với MenuItem cuối cùng. Tôi sẽ xem xét SoapVar và SoapParam. Cảm ơn! – Fostah

+0

Có thể gửi _soapCall với tên hàm và thay vì gửi đối số dưới dạng mảng, tôi có thể gửi chuỗi XML đó thay thế không? Tôi không thể tìm ra cách để làm điều đó. Cảm ơn! – Fostah

+0

@Fostah như bạn đã chấp nhận câu trả lời rõ ràng là nó đã giúp bạn gỡ lỗi/sửa chương trình, nhưng bạn có nhớ đăng chính xác nguyên nhân của XML không chính xác không? –