2012-05-10 169 views
0

我试图创造适宜的基于WSDL的SOAP请求,但没有成功适当的SOAP XML请求,我这里是什么,我需要: soap.xml:不能产生通过PHP

<?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:信封代替SOAP-ENV:信封

2.in头:我有NS2:AuthMember代替AuthMember

3。在身体我有NS1:AuthenticateMember而不是AuthenticateMember xmlns =“http://tempuri.org/”

我怎样才能得到正确的XML?我已经浏览了php函数手册,找不到答案,谷歌搜索没有给我成功的结果,我的情况。

你能帮忙吗?

回答

1

已经产生的结果是什么代码被请求,但命名空间的某些属性的解释是为了:

每个XML文档中的标签都有一个完全合格的形式由名称空间和标记名称定义(即使它位于“默认”名称空间中,但没有明确的名称空间声明)。完全限定版本通常写为{namespace}标记。通过解析完全限定名称,可以确定两个元素的表示是否相同。

命名空间与以多种方式元件,包括明确的名称空间包括与所述元件相关联

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-ENVrandomprefix可用于http://schemas.xmlsoap.org/soap/envelope/命名空间),但好的做法是使用有意义的东西

鉴于此,“期望”和“实际”文档中的完全限定元素几乎相同,异常是头元素AuthMember。根据您的需要,您可以指定一个名称空间http://tempuri.org/,以获得完全合格的{http://tempuri.org/}AuthMember。在实际中,前缀关联结果为完全合格的{http://schemas.xmlsoap.org/ws/2002/07/utility}AuthMember

这是SoapHeader实例化的结果,它指定了AuthMember的... utility命名空间。在您的代码中更改该语句以使用名称空间应该会导致实际的文档与所需的匹配。

+0

非常感谢!你是对的,我已经将命名空间改为http://tempuri.org/,它起作用了! – dave101ua