带有属性的SOAP请求

Pie*_*ing 6 php soap soap-client

我似乎无法找到如何在不使用XSD_ANYXML编码的情况下将属性设置为SOAP请求.

请求参数应如下所示

<request
    xmlns:ns="/some/ns">
    ...
        <ns:parameter attr="some attribute">
            value
        </ns:parameter>
    ...
</request>
Run Code Online (Sandbox Code Playgroud)

当然下面的代码可以工作,但它相当丑陋(丑陋,因为它使用字符串连接,它应该使用SOAP_Client API,因为它不使用通用命名空间)

$param = new SoapVar(
    '<ns_xxx:parameter xmlns:ns_xxx="/some/ns" attr="some attribute">
        value
     </ns_xxx:parameter>',
    XSD_ANYXML
);
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来创建具有命名空间和属性的SOAP请求参数?

我正在寻找s.th. 如下所示(这只是使用SoapVar API的一些伪代码):

$param = new SoapVar(
    array(
        '_' => 'value',
        'attr' => 'some attribute'
    ), 
    SOME_ENCODING,
    null,
    null,
    null,
    '/some/ns'
);
Run Code Online (Sandbox Code Playgroud)

Red*_*oon 0

SOAP 不支持属性,也许您应该使用 REST!

编辑: 请检查正文样式 w3c:"4.3 SOAP Body" 并记住您需要使用“soap-envelope”命名空间对消息进行编码并描述您的 XML 类型,这就是为什么您不能使用属性来描述消息数据。

但如果你问我,这是可能的!您可以使用自定义 SoapClient 解析器或类似的东西,并根据需要转换消息。例如,RSS over SOAP http://www.ibm.com/developerworks/webservices/library/ws-soaprdf。但是,问题是您会错过有关您的消息数据/类型的描述性信息,并且其他客户端无法轻松理解您的消息!

我对您的最佳实践是使用元素而不是属性,我知道您需要修复您的 XML 架构,但这就是它的方式或切换到其他技术。

  • 我理解您更喜欢 REST 而不是 SOAP。但这个答案确实没有任何帮助。当人们试图用某种特定技术解决问题时,告诉他们不要使用某种技术是没有帮助的。另外,您编写的内容完全错误:SOAP 确实支持属性。参见http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383492 (3认同)