2016-11-29 3 views
3

Ich bin neu in webservices Ich versuche webservice zu rufen mit Soapclient() und es ist anfordern XML zu erzeugen, die in Format ist nicht zu erwartenPHP Soapclient: Was ist NS2

Im Folgenden wird erwartet Format der Anfrage 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> 

Im Folgenden finden Sie XML anfordern Erzeugen von meinem Code

<?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> 

Unten ist mein Code

$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

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

+0

'ns2' Namespace – Bobot

Antwort

2

Jedes Mitglied Ihres Objekts muss ein SoapVar-Objekt sein, da ein Namespace für sie vorhanden ist. Codieren Sie einfach Ihr Objekt, wie das folgende Beispiel zeigt.

Tun Sie es einfach für alle Klassenmitglieder und Sie erhalten das erwartete Ergebnis.

Aus fortgeschrittenem Grund ist hier ein Beispiel, wie Sie das Präfix des Namespace ändern können. Sie müssen wissen, dass das PHP SoapClient-Objekt und das SoapVar-Objekt eine Möglichkeit haben, ein Namespace-Präfix manuell festzulegen. In einem normalen Fall ist es nicht notwendig, ein Präfix für einen Namespace festzulegen.

Das PHP-SoapClient-Objekt verfügt über eine __doRequest-Methode, mit der Sie das XML bearbeiten können. Sie müssen Ihren eigenen SoapClient codieren, indem Sie den PHP SoapClient erweitern.

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); 
    } 
} 

In meinen Augen ist es nicht notwendig, das Namespace-Präfix zu ändern. Wenn ja, verwenden Sie einfach die __doRequest-Methode für Ihren Zweck.

+0

Sie haben 'ns2' wie dieses' XSD_STRING hinzuzufügen, null, 'ns2', 'companyCode' ', um den Namespace zu 'ns2' zu bekommen, nein? – Bobot

+2

Nein, die Deklarationen 'ns2' oder 'ns1' werden automatisch vom Soap-Client ausgeführt. Der dritte und der vierte Parameter des SoapVar-Objekts sind für Typdeklarationen. Der fünfte und sechste Parameter sind für den Knotennamen und den Knotennamensraum. Also ist der Namespace mit dem letzten Parameter gemacht. Es ist nicht wichtig, wie ein Namespace in der XML-Datei vorangestellt wird. Das Präfix 'ns1' funktioniert einwandfrei, da außer dem Soapenv-Namespace kein anderer Namespace deklariert ist. – Marcel

+0

@marcel: Jetzt sehe ich "ns1" für alle params in meiner XML-Anfrage, aber "ns2" wird erwartet –