【问题标题】:Allowing Attributes in SoapVar / SoapHeader Without a Type Definition or Namespace允许 SoapVar / SoapHeader 中的属性没有类型定义或命名空间
【发布时间】:2016-09-29 13:37:24
【问题描述】:

我得到了一个不包含任何soap 头模式或定义的WSDL,但端点需要一个WSSE 类型的头。我正在使用SoapClient 来处理这些请求。

所有请求的标头中都必须包含这个:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken>
        <wsse:Username>Username</wsse:Username>
        <wsse:Password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
    </wsse:UsernameToken>
</wsse:Security>

如果我沿着 StackOverflow 和在线 PHP 文档 cmets 多次建议的路线,我能得到的最接近的是:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="..." xmlns:ns2="..." xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <SOAP-ENV:Header>
        <ns3:Security>
            <ns3:UsernameToken>
                <ns3:Username>Username</ns3:Username>
                <ns3:Password>Password</ns3:Password>
            </ns3:UsernameToken>
        </ns3:Security>
 ...

注意它是如何将命名空间添加到soap信封的,而给出的规范/示例将命名空间专门添加到Security元素。不过,我认为这并不重要。无论哪种方式,Password 元素都缺少它的 type 属性。 我也试过沿着数组路线走,使用:

$securityNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';

// ...

$password = new \SoapVar(
    [
        '_' => 'Password',
        'type' => 'http://...'
    ],
    SOAP_ENC_OBJECT,
    null,
    $securityNamespace,
    null,
    $securityNamespace
);

生成如下:

<value>
    <item>
        <key>_</key>
        <value>PASSWORD</value>
    </item>
    <item>
        <key>type</key>
        <value>http://...</value>
    </item>
</value>

这显然是 SoapClient 找不到要验证的元素类型时的典型响应。

WSDL 和随附的 XSD 保存在本地以用于缓存目的,是否值得尝试修改 WSDL 以包含 WSSE 标头(如果可能),或者是否有另一种逻辑方法可以为此命名空间生成正确的 SOAP 标头/XSD 架构?

【问题讨论】:

  • 作为一种风格,端点明确说明了为什么它们不在其 WSDL 中包含标头信息:1)它是可选的,2)最好不定义身份验证以保持它从实际服务中抽象出来。

标签: php xml soap wsdl soap-client


【解决方案1】:

https://github.com/goetas-webservices/soap-client 是完全 PHP SOAP 客户端,不依赖 PHP 中的 ext-soap

它已经支持 PSR7、多客户端,并允许通过 IDE 生成用于类型提示的类。

https://github.com/goetas-webservices/soap-client-demo 是一个演示项目,可让您了解如何使用客户端来使用通用 SOAP Web 服务。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多