0

我正在尝试创建正确的基于 wsdl 的肥皂请求,但没有成功,这是我需要的示例: 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.它生成 SOAP-ENV:Envelope 而不是 SOAP-ENV:Envelope

2.in 标头:我有 ns2:AuthMember 而不是 AuthMember

3.在正文中我有 ns1:AuthenticateMember 而不是 AuthenticateMember xmlns="http://tempuri.org/"

我怎样才能得到正确的 xml ?我查看了 php 函数手册并找不到答案,谷歌搜索并没有给我的案例提供成功的结果。

能否请你帮忙 ?

4

1 回答 1

1

生成的结果就是代码中要求的,但是对命名空间的一些属性的解释是有序的:

XML 文档中的每个标签都有一个完全限定的形式,它由名称空间和标签名称定义(即使它位于没有显式名称空间声明的“默认”名称空间中)。完全限定的版本通常写为{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

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

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

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

于 2012-05-10T22:41:22.980 回答