2013-09-25 39 views
4

我試圖讓使用SoapClient的類從PHP SOAP請求這是我的代碼:PHP SoapClient的發送自定義XML

$xmlstr = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://localhost:8090/mockCustomerManagement/types"> 
    <soapenv:Header> 
     <typ:customerManagementHeader> 
     <typ:userId>42</typ:userId> 
     <typ:requestId>1500</typ:requestId> 
     <typ:messageTimestamp>2013-09-25T14:31:21+00:00</typ:messageTimestamp> 
     </typ:customerManagementHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <typ:getCustomerInfoData> 
     <useremail>[email protected]</useremail> 
     </typ:getCustomerInfoData> 
    </soapenv:Body> 
</soapenv:Envelope> 
XML; 

$wsdl = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding?WSDL'; 
$client = new SoapClient($wsdl, array(
    'cache_wsdl' => WSDL_CACHE_NONE, 
    'cache_ttl'  => 86400, 
    'trace'   => true, 
    'exceptions' => true, 
)); 

$xmlVar = new SoapVar($xmlstr, XSD_ANYXML); 
$client->getCustomerInfo($xmlstr); 

但請求扔給我一個例外,當我問客戶端的最後一個請求,它顯示了在開始時,在我的XML月底一些額外的文字,你可以看到:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost:8090/mockCustomerManagement/types"> 
<SOAP-ENV:Body> 

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://localhost:8090/mockCustomerManagement/types"> 
    <soapenv:Header> 
     <typ:customerManagementHeader> 
     <typ:userId>42</typ:userId> 
     <typ:requestId>1500</typ:requestId> 
     <typ:messageTimestamp>2013-09-25T14:31:21+00:00</typ:messageTimestamp> 
     </typ:customerManagementHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <typ:getCustomerInfoData> 
     <useremail>[email protected]</useremail> 
     </typ:getCustomerInfoData> 
    </soapenv:Body> 
</soapenv:Envelope> 

</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

有一些方法來刪除/禁用多餘的文字?換句話說,有沒有辦法只發送我的XML?

+0

聽起來像這樣來解析SOAP響應相似,如果不是完全一樣用先前的問答[通過PHP SoapClient請求發送原始XML](http://stackoverflow.com/q/9608314/367456)如此交叉鏈接以供參考。 - 問答式自我風格+1。 – hakre

回答

5

沒有什麼可以提出問題來找到答案。我擴展了SoapClient類,並以這種方式發送了正確的XML。這是代碼:

/** 
* Extend SoapClientClass 
*/ 
class anotherSoapClient 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 __anotherRequest($call, $params) { 
     $location = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding'; 
     $action = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding/'.$call; 
     $request = $params; 
     $result =$this->__doRequest($request, $location, $action, '1'); 
     return $result; 
    } 
} 

// Create new SOAP client 
$wsdl = 'http://localhost:8090/mockCustomerManagementSoapHttpBinding?WSDL'; 
$client = new anotherSoapClient($wsdl, array(
    'cache_wsdl' => WSDL_CACHE_NONE, 
    'cache_ttl'  => 86400, 
    'trace'   => true, 
    'exceptions' => true, 
)); 

// Make the request 
try { 
    $request = $client->__anotherRequest('getCustomerInfo', $XMLrequest); 
} catch (SoapFault $e){ 
    echo "Last request:<pre>" . htmlentities($client->__getLastRequest()) . "</pre>"; 
    exit(); 
} 

header('Content-type: text/xml'); 
echo $request; 

我用SOAP_UI的免費版本來測試響應。

+0

您也可以從XML中刪除SoapEnvelope,因爲它不是參數的一部分。 – hakre

+4

請問你能指定'$ XMLrequest'在你的例子中的外觀嗎? – Jacobian

-1
// xml post structure 
     $xml_post_string = '<?xml version="1.0" encoding="utf-8"?> 
          <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
            <soap:Header> 
            <AuthHeader xmlns="http://tempuri.org/"> 
             <UserName>username</UserName> 
             <Password>password</Password> 
            </AuthHeader> 
            </soap:Header> 
            <soap:Body> 
            <webservice_method_name xmlns="http://tempuri.org/" /> 
            </soap:Body> 
           </soap:Envelope>'; 
      $headers = array(
         "Content-type: text/xml;charset=\"utf-8\"", 
         "Accept: text/xml", 
         "Cache-Control: no-cache", 
         "Pragma: no-cache", 
         "SOAPAction:http://tempuri.org/webservice_method_name", 
         "Content-length: ".strlen($xml_post_string), 
        ); 
      $url = "http://yourwebserviceurl.com/servicename.asmx"; 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
      curl_setopt($ch, CURLOPT_POST, true); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); 
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
      $response = curl_exec($ch); 
      curl_close($ch); 

// $迴應顯示XML響應

如何使用PHP爲看下面的網站

https://vaja906programmingworld.wordpress.com/