PHP SoapClient的:什么是NS2

问题描述:

我是新来的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

您的对象的每个成员都必须是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” –