无法通过php生成正确的soap xml请求

时间:2012-05-10 17:24:37

标签: php soap wsdl

我正在尝试创建适当的基于wsdl的soap请求,但没有成功,这里是我需要的示例: 的 soap.xml:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
      <AuthMember xmlns="http://tempuri.org/">
           <somefield>string</somefield>
      </AuthMember>
  </soap:Header>
  <soap:Body>
      <AuthenticateMember xmlns="http://tempuri.org/" />
  </soap:Body>
</soap:Envelope>

我的结果是: 的 soap.xml:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"             xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://schemas.xmlsoap.org/ws/2002/07/utility">
<SOAP-ENV:Header>
    <ns2:AuthMember>
        <somefield>somefieldvalue</somefield>
    </ns2:AuthMember>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <ns1:AuthenticateMember/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是我的PHP代码:



    class SoapHeaderAuthMember
    {

        public $somefield;

        public function __construct($somefield)
        {

            $this->somefield = $somefield;        

        }
    }

    $client = new SoapClient( 'https://www.somepage.com/service.asmx?WSDL', 
        array("exceptions"=>0, "trace" => 1 )
    );
    $authMember = new SoapHeaderAuthMember('somefieldvalue');


    $soapHeaders[] = new SoapHeader('http://schemas.xmlsoap.org/ws/2002/07/utility', 'AuthMember', $authMember);
    $client->__setSoapHeaders($soapHeaders);                 

    $client->__soapCall('AuthenticateMember',array());


看,

1.it生成SOAP-ENV:Envelope而不是SOAP-ENV:Envelope

2.in header:我有ns2:AuthMember而不是AuthMember

3.在体内我有ns1:AuthenticateMember而不是AuthenticateMember xmlns =“http://tempuri.org/”

如何获得正确的xml?我查看了php函数手册并找不到答案,谷歌搜索没有给我成功的结果。

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

已生成的结果是代码中已请求的结果,但对命名空间的某些属性的解释依次为:

XML文档中的每个标记都有一个完全限定的表单,该表单由命名空间和标记名称定义(即使它位于'default'命名空间中,没有显式的命名空间声明)。完全限定版本通常写为 {namespace} tag 。通过解析完全限定名称,可以确定两个元素的表示是否相同。

命名空间以多种方式与元素相关联,包括使用元素

显式命名空间
Example:
<AuthMember xmlns="http://tempuri.org/">
resolving to fully-qualified name {http://tempuri.org/}AuthMember

并通过名称空间关联的前缀

Example:
<... xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
resolving to {http://schemas.xmlsoap.org/soap/envelope/}Header

前缀在声明前缀的元素和任何包含的元素的范围内。使用的实际前缀并不重要( soap SOAP-ENV randomprefix 可用于 http:// schemas。 xmlsoap.org/soap/envelope / 名称空间),虽然好的做法是使用有意义的东西。

鉴于此,“所需”和“实际”文档中的完全限定元素几乎相同,异常是标题元素AuthMember。在您想要的内容中,您可以为完全限定的 {http://tempuri.org/} AuthMember 指明 http://tempuri.org/ 的命名空间。实际上,前缀关联会产生完全限定的 {http://schemas.xmlsoap.org/ws/2002/07/utility} AuthMember

这是SoapHeader实例化的结果,为AuthMember指定了...实用程序命名空间。在代码中更改该语句以使用 http://tempuri.org/ 命名空间应该会使实际文档与所需文档匹配。