【问题标题】:cannot generate proper soap xml request via php无法通过php生成正确的soap xml请求
【发布时间】:2012-05-19 08:00:20
【问题描述】:

我正在尝试创建正确的基于 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.in body 我有 ns1:AuthenticateMember 而不是 AuthenticateMember xmlns="http://tempuri.org/"

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

你能帮忙吗?

【问题讨论】:

    标签: php soap wsdl


    【解决方案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
    

    前缀在声明前缀的元素和任何包含的元素的范围内。实际使用的前缀并不重要(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。

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

    【讨论】:

    • 非常感谢!你是对的,我已将命名空间更改为 tempuri.org 并且它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多