2016-11-29 8 views
3

Я новичок в веб-сервисы я пытаюсь вызвать веб-сервиса с 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, потому что для него существует пространство имён. Просто закодируйте свой объект, как показывает пример follwing.

$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

Вы должны добавить 'NS2' как этот' XSD_STRING, null, 'ns2', 'companyCode'', чтобы пространство имен было 'ns2' no? – Bobot

+2

Нет, объявления 'ns2' или 'ns1' автоматически выполняются клиентом мыла. Третий и четвертый параметр объекта SoapVar предназначены для объявлений типов. Пятый и шестой параметры для имени узла и пространства имен узлов. Таким образом, пространство имен выполняется с последним параметром. Не важно, как пространство имен имеет префикс в xml. Префикс «ns1» работает отлично, потому что нет другого пространства имен, объявленного отдельно от пространства имен soapenv. – Marcel

+0

@marcel: Теперь я вижу «ns1» для всех параметров в моем XML-запросе, но ожидается «ns2» –