2016-11-29 101 views
3

我是新來的WebServices我試圖調用web服務與SoapClient的()和它的生成XML請求未在預期的格式PHP SoapClient的:什麼是NS2

低於預期請求XML格式

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
    <ns2:EndUserRequest xmlns:ns2="http://www.example.net/EndUserRequest"> 
     <ns2:companyCode>MD</ns2:companyCode> 
     <ns2:customerBranch>60</ns2:customerBranch> 
     <ns2:customerNumber>112946</ns2:customerNumber> 
     <ns2:endUserName>Some Name</ns2:endUserName> 
     <ns2:ContactName /> 
     <ns2:address /> 
     <ns2:city /> 
     <ns2:state /> 
     <ns2:postalCode /> 
     <ns2:email /> 
     <ns2:phoneNumber /> 
     <ns2:countryCode>US</ns2:countryCode> 
    </ns2:EndUserRequest> 
</soapenv:Body> 
</soapenv:Envelope> 

下面是XML請求生成由我的代碼

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.emaple.com/EndUserRequest"> 
    <SOAP-ENV:Body> 
     <ns1:EndUserRequest xmlns:ns1="http://www.example.net/EndUserRequest"> 
      <companyCode>MD</companyCode> 
      <customerBranchNumber>360</customerBranchNumber> 
      <customerNumber>53494711</customerNumber> 
      <endUserName>ABCED</endUserName> 
      <ContactName></ContactName> 
      <address></address> 
      <city></city> 
      <state></state> 
      <postalCode></postalCode> 
      <email></email> 
      <phoneNumber></phoneNumber> 
      <countryCode>US</countryCode> 
     </ns1:EndUserRequest> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

下面是我的代碼

$client = new SoapClient('https://api-beta.example.com:443/enduser/v1/enduserlist?wsdl', array(
     "trace" => 1,     
     "stream_context" => stream_context_create($streamContext), 
     'cache_wsdl' => WSDL_CACHE_NONE 
     )); 

     $endUserRequest = new stdClass; 
     $endUserRequest->companyCode = 'MD'; 
     $endUserRequest->customerBranchNumber = '560'; 
     $endUserRequest->customerNumber = '59471321'; 
     $endUserRequest->endUserName = 'Somename'; 
     $endUserRequest->ContactName = ''; 
     $endUserRequest->address = ''; 
     $endUserRequest->city = ''; 
     $endUserRequest->state = ''; 
     $endUserRequest->postalCode = ''; 
     $endUserRequest->email = ''; 
     $endUserRequest->phoneNumber = ''; 
     $endUserRequest->countryCode = 'US'; 



    $requestSoapVar = new SoapVar($endUserRequest, SOAP_ENC_OBJECT,null,null,'EndUserRequest','http://www.example.com/EndUserRequest'); 
     $res = $client->GetEndUsers($requestSoapVar); 
     echo '<textarea style="width:600px;height:500px">'; 
      echo "\n-------Request Header------\n"; 
      echo $client->__getLastRequestHeaders(); 
      echo "\n-------Request------\n"; 
      echo $client->__getLastRequest(); 
      echo "\n-------Response Header------\n"; 
      echo $client->__getLastResponseHeaders(); 
      echo "\n-------Response------\n"; 
      echo $client->__getLastResponse(); 
     echo '</textarea>'; 

     echo '<textarea style="width:600px;height:500px">'; 
     print_r($res); 
     echo '</textarea>'; 
+0

[stackoverflow](http://stackoverflow.com/questions/28737554/difference-between-two-soap-requests) – abhi

+0

'ns2'命名空間 – Bobot

回答

2

您的對象的每個成員都必須是SoapVar對象,因爲它們有一個名稱空間。正如下面的例子所示,編碼你的對象。

$oEndUserRequest = new StdClass(); 
$oEndUserRequest->companyCode = new SoapVar(
    'MD', 
    XSD_STRING, 
    null, 
    null, 
    'companyCode', 
    'http://www.example.com/EndUserRequest' 
); 

只是爲everey類成員做,你會得到預期的結果。

由於高級的原因,這裏有一個例子說明如何改變命名空間的前綴。您必須知道,PHP SoapClient對象和SoapVar對象都有手動設置命名空間前綴的方法。在正常情況下,不需要爲名稱空間設置前綴。

PHP SoapClient對象有一個__doRequest方法,您可以在其中編輯XML。你必須編寫你自己的SoapClient來擴展PHP SoapClient。

class MySoapClient extends SoapClient { 
    public function __doRequest($sRequest, $sLocation, $sAction, $iVersion, $iOneWay = 0) { 
     $sRequest = str_replace('ns1', 'ns2', $sRequest); 
     $this->__last_request = $sRequest; 

     return parent::__doRequest(ltrim($sRequest), $sLocation, $sAction, $iVersion, $iOneWay); 
    } 
} 

在我看來,不需要改變命名空間前綴。如果是這樣,只需使用__doRequest方法達到您的目的。

+0

您必須像'XSD_STRING'一樣添加'ns2' null,'ns2','companyCode'來獲取命名空間爲'ns2'否? – Bobot

+2

不可以,'ns2'或'ns1'聲明由肥皂客戶端自動完成。 SoapVar對象的第三個和第四個參數用於類型聲明。第五個和第六個參數用於節點名稱和節點名稱空間。所以命名空間是用最後一個參數完成的。如何在XML中添加一個名稱空間並不重要。前綴'ns1'可以正常工作,因爲除了soapenv命名空間外,沒有其他名稱空間聲明。 – Marcel

+0

@marcel:現在我在我的XML請求中看到了所有參數的「ns1」,但期望「ns2」 –