PHP SoapClient:如何将SOAP参数标记名称添加到命名空间?

时间:2013-07-25 10:16:31

标签: php soap soap-client

我正在使用PHP的SoapClient来使用SOAP服务,但是收到的错误是SOAP服务无法看到我的参数。

<tns:GenericSearchResponse xmlns:tns="http://.../1.0">
  <tns:Status>
    <tns:StatusCode>1</tns:StatusCode>
    <tns:StatusMessage>Invalid calling system</tns:StatusMessage>
  </tns:Status>
</tns:GenericSearchResponse>

XML PHP的SoapClient发送SOAP调用:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="http://.../1.0">
  <SOAP-ENV:Body>
    <ns1:GenericSearchRequest>
      <UniqueIdentifier>12345678</UniqueIdentifier>
      <CallingSystem>WEB</CallingSystem>
    </ns1:GenericSearchRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我最初使用soap-ui,在使用相同的WSDL时成功运行。 XML soap-ui发送呼叫:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://.../1.0">
  <SOAP-ENV:Body>
    <ns1:GenericSearchRequest>
      <ns1:UniqueIdentifier>12345678</ns1:UniqueIdentifier>
      <ns1:CallingSystem>WEB</ns1:CallingSystem>
    </ns1:GenericSearchRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

{@ 1}}和UniqueIdentifier参数的差异在soap-ui请求中以CallingSystem为前缀。

我已尝试将ns1个对象传递给SoapVar来电,但这不会扩充参数标记,并以SoapClient为前缀。

我知道ns1是一个有效的WEB值,因为XSD指定了它,并且它在使用soap-ui时有效。

我当前的CallingSystem代码:

SoapClient

我找到this blog post,但我希望可能会有更清洁的实施。

更新 使用solution from this question,但非常笨重:

try {
  $client = new SoapClient($wsdl, array('trace' => 1));
  $query = new stdClass;
  $query->UniqueIdentifier = $id;
  $query->CallingSystem = 'WEB';
  $response = $client->GenericUniqueIdentifierSearch($query);
} catch (SoapFault $ex) {
  $this->view->error = $ex->getMessage();
  ...
}

2 个答案:

答案 0 :(得分:5)

我发现这样做的合理方法是使用SoapVar和SoapParam的组合。

注意,SoapVar可以选择指定每个var的命名空间。

所以你的代码应该是这样的:

$wrapper = new StdClass;
$wrapper->UniqueIdentifier = new SoapVar($id, XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema", "UniqueIdentifier", "ns1");
$wrapper->CallingSystem = new SoapVar("WEB", XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema", "CallingSystem", "ns1");
$searchrequest = new SoapParam($wrapper, "GenericSearchRequest");

try{
    $response = $this->client->GenericUniqueIdentifierSearch($searchrequest);
}catch(Exception $e){
    die("Error calling method: ".$e->getMessage());
}

如果您遇到属性和方法获得不同命名空间的问题,请尝试将SoapVar的命名空间指定为信封中定义的URL(在您的示例中为“http://.../1.0”),如:< / p>

$wrapper->UniqueIdentifier = new SoapVar($id, XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema", "UniqueIdentifier", "http://.../1.0");

请参阅Soap constants以获取所有XSD_ *常量的列表。

答案 1 :(得分:4)

使用SoapVar命名GenericSearchRequest字段:

$xml = "<ns1:GenericSearchRequest>"
     . "<ns1:UniqueIdentifier>$id</ns1:UniqueIdentifier>"
     . "<ns1:CallingSystem>WEB</ns1:CallingSystem>"
     . "</ns1:GenericSearchRequest>";
$query = new SoapVar($xml, XSD_ANYXML);

$response = $this->client->__SoapCall(
    'GenericUniqueIdentifierSearch',
    array($query)
);