如何使用 PHP SoapClient 添加任意命名空间?

2024-05-09

如何使用 PHP SoapClient 添加任意名称空间?命名空间实际上并未在请求中使用,但我认为它阻止了我的消息被正确使用。

WSDL 在这里:http://abr.business.gov.au/abrxmlsearchRPC/ABRXMLSearch.asmx?WSDL http://abr.business.gov.au/abrxmlsearchRPC/ABRXMLSearch.asmx?WSDL

我要发送的特定消息的文档位于此处:http://abr.business.gov.au/abrxmlsearchRPC/(nye2ok45xc42vy552b15dx3t)/FormGenerator/ABRSearchByNameSimpleProtocol.aspx http://abr.business.gov.au/abrxmlsearchRPC/(nye2ok45xc42vy552b15dx3t)/FormGenerator/ABRSearchByNameSimpleProtocol.aspx。我正在执行 SOAP 请求。

在soap:Envelope 中,您会注意到一个名为xmlns:types="http://abr.business.gov.au/ABRXMLSearchRPC/encodedTypes" 的命名空间,并且您还会注意到soap:Body 中未使用它。

我发送的消息是:(为了可读性而添加换行符和缩进,为了安全性而对authenticationGuid进行模糊处理)

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://abr.business.gov.au/ABRXMLSearchRPC/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns1:ABRSearchByNameSimpleProtocol>
            <name xsi:type="xsd:string">company</name>
            <postcode xsi:type="xsd:string"></postcode>
            <legalName xsi:type="xsd:string">Y</legalName>
            <tradingName xsi:type="xsd:string">Y</tradingName>
            <NSW xsi:type="xsd:string">Y</NSW>
            <SA xsi:type="xsd:string">Y</SA>
            <ACT xsi:type="xsd:string">Y</ACT>
            <VIC xsi:type="xsd:string">Y</VIC>
            <WA xsi:type="xsd:string">Y</WA>
            <NT xsi:type="xsd:string">Y</NT>
            <QLD xsi:type="xsd:string">Y</QLD>
            <TAS xsi:type="xsd:string">Y</TAS>
            <authenticationGuid xsi:type="xsd:string">aaaa</authenticationGuid>
        </ns1:ABRSearchByNameSimpleProtocol>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我得到的回复是:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://abr.business.gov.au/ABRXMLSearchRPC/" xmlns:types="http://abr.business.gov.au/ABRXMLSearchRPC/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">    
        <types:ABRSearchByNameSimpleProtocolResponse><ABRSearchByNameSimpleProtocolResult href="#id1" /></types:ABRSearchByNameSimpleProtocolResponse>
        <types:Payload id="id1" xsi:type="types:Payload">
            <Request href="#id2" />
            <Response href="#id3" />
        </types:Payload>
        <types:ExternalRequest id="id2" xsi:type="types:ExternalRequest">           
            <ExternalRequestBody href="#id4" />
        </types:ExternalRequest>
        <types:Response id="id3" xsi:type="types:Response">
            <DateRegisterLastUpdated xsi:type="xsd:dateTime">0001-01-01T00:00:00.0000000+11:00</DateRegisterLastUpdated>
            <DateTimeRetrieved xsi:type="xsd:dateTime">2011-05-26T09:31:06.2949724+10:00</DateTimeRetrieved>
            <ResponseBody href="#id5" />
        </types:Response>
        <types:ExternalRequestNameSearch id="id4" xsi:type="types:ExternalRequestNameSearch">
            <AuthenticationGUID xsi:type="xsd:string" />
            <Name xsi:type="xsd:string" />
            <Filters href="#id6" />
        </types:ExternalRequestNameSearch>
        <types:ResponseException id="id5" xsi:type="types:ResponseException">
            <ExceptionDescription xsi:type="xsd:string">The GUID entered is not recognised as a Registered Party.

 Search GUID: </ExceptionDescription>
            <ExceptionCode xsi:type="xsd:string">WebServices</ExceptionCode>  
        </types:ResponseException>
        <types:ExternalRequestFilters id="id6" xsi:type="types:ExternalRequestFilters">
            <NameType href="#id7" />
            <Postcode xsi:type="xsd:string" />
            <StateCode href="#id8" />
        </types:ExternalRequestFilters>
        <types:ExternalRequestFilterNameType id="id7" xsi:type="types:ExternalRequestFilterNameType">
            <TradingName xsi:type="xsd:string">Y</TradingName>
            <LegalName xsi:type="xsd:string">Y</LegalName>
        </types:ExternalRequestFilterNameType>
        <types:ExternalRequestFilterStateCode id="id8" xsi:type="types:ExternalRequestFilterStateCode">
            <QLD xsi:type="xsd:string">Y</QLD>
            <NT xsi:type="xsd:string">Y</NT>
            <SA xsi:type="xsd:string">Y</SA>
            <WA xsi:type="xsd:string">Y</WA>
            <VIC xsi:type="xsd:string">Y</VIC>
            <ACT xsi:type="xsd:string">Y</ACT>
            <TAS xsi:type="xsd:string">Y</TAS>
            <NSW xsi:type="xsd:string">Y</NSW>
        </types:ExternalRequestFilterStateCode>
    </soap:Body>
</soap:Envelope>

看起来消费者完全忽视了消息的内容。我可以看到示例中唯一缺少的是类型命名空间,它包含在响应中。

因此,我认为如果我可以任意将类型命名空间添加到请求中,可能会有更好的运气。

如果有人能告诉我如何做到这一点,或者提供一些其他建议,说明为什么消费者会忽略我在请求中给出的值,我将不胜感激。

更新:扩展 SoapClient 并覆盖 __doRequest() 以添加命名空间实际上可能是解决方案,但我希望得到更了解的人的确认。应该注意的是,SoapClient::getLastRequest() 的内容是在 __doRequest() 进行修改之前生成的,因此通过 __doRequest() 进行的任何修改可能需要通过 tcp 转储来观察。

示例代码是

class ABRSoapClient extends SoapClient {

    function __doRequest($request, $location, $action, $version) {
        $dom = new DOMDocument('1.0', 'UTF-8');
        $dom->preserveWhiteSpace = false;
        $dom->loadXML($request);

        $dom->documentElement->setAttribute
        ('xmlns:types', 'http://abr.business.gov.au/ABRXMLSearchRPC/encodedTypes');

        $request = $dom->saveXML();

        error_log('Request in class:'.$request);

        return parent::__doRequest($request, $location, $action, $version);
    }
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PHP SoapClient 添加任意命名空间? 的相关文章

随机推荐

  • 在 keras 中使用自定义张量流操作

    我在张量流中有一个脚本 其中包含自定义张量流操作 我想将代码移植到 keras 但我不确定如何在 keras 代码中调用自定义操作 我想在 keras 中使用tensorflow 所以到目前为止我发现的教程描述了与我想要的相反的内容 htt
  • SASS/Compass可以将foo.scss编译为foo.min.css和foo.dbg.css吗?

    我想整理一套 scss文件为不同的文件名 在开发中 我想编译例如 foo scss to foo dbg css 未缩小并带有评论 在生产中 我想要例如 foo min css 缩小 有没有办法告诉 SASS Compass 使用什么作为目
  • 为什么 dart 不允许方法重载?

    我尝试在一些 dart 代码中使用方法重载 并很快了解到 dart 中不提供重载 我的问题是 为什么不提供 推荐的替代方案是什么 是否有标准的命名约定 因为执行相同操作但具有不同输入的方法必须具有不同的名称 使用命名参数然后检查调用者是否提
  • Google BigQuery:如何使用 SQL 创建新列

    我想在不使用旧版 SQL 的情况下向现有表添加一列 基本的 SQL 语法是 ALTER TABLE table name ADD column name datatype 我格式化了 Google BigQuery 的查询 ALTER TA
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 了解执行模型和事件循环

    我读过很多关于JavaScript单线程执行模型 事件循环和事件队列的文章 但有一件事尚不清楚 我创建了一个小提琴来说明我的问题 http jsfiddle net yzpmf67f http jsfiddle net yzpmf67f
  • 在 PHP 中计算 Cookie 大小

    我想使用 php 在服务器端读取 cookie 并计算其长度 但找不到任何直接方法来执行此操作 那么如何实现这个任务呢 那这个呢 setcookie user Dino babu kannampuzha time 3600 if isset
  • PHP 使用 use 关键字导入类

    到目前为止我还没有使用PHPuse词 但现在必须 索引 php内容 require once Classes MainClass php obj new Main echo obj gt test 类 MainClass php
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • DBPedia:URI 中“__1”(双下划线)的含义是什么?

    在 DBPedia 上你可以找到很多包含双下划线和末尾有数字的 URI 例如 http dbpedia org resource Eric Cheney 1 http dbpedia org resource Eric Cheney 1 h
  • git-daemon 的日志保存在哪里? (Windows 上的 Git 使用 Cygwin)

    我正在将 git daemon 作为 Windows 服务运行 使用创建进程 服务中使用的命令是 git daemon reuseaddr base path data test work export all verbose enable
  • 如何归档旧的 git 标签?

    我的 git 存储库中有一些不再重要的旧标签 我想存档标签 以便在运行 git tag 时默认情况下它们不会显示 我不想删除它们 因为我想保留历史记录 我怎样才能做到这一点 可以将标签保留在存储库中并避免将它们列为标签 它还可以避免默认克隆
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 关系上的核心数据属性?

    我刚刚开始使用核心数据 我有一个Headache实体和一个Medication实体 头痛和药物之间存在多对多的关系 当您加重头痛时 您可以选择多种药物 我希望能够指定这些药物的数量 我对 MySQL 更熟悉 您可以在其中创建一个数据透视表
  • GCM(Google 云消息传递)是否需要 Google 帐户?

    我需要编写一个简单的应用程序来获取推送通知 我使用 GCM 它使用 Google Play 服务来获取信息 我的问题是 要访问 GCM 是否需要 Google 帐户 我可以使用其他电子邮件帐户来识别设备吗 有没有其他方法可以获取另一个电子邮
  • 单个 sql 查询可以处理 sql server 中的 null 或值日期范围

    使用 SQL Server 2008 我有一个存储过程 其中开始日期和结束日期作为日期范围的输入参数 寻找一个singlesql 查询 其中在 where 子句中有一个开始日期和结束日期 可以处理日期均为空或都有值的两种情况 我不想使用 I
  • Xcode 中定义的宏 CURRENT_PROJECT_VERSION 在哪里?

    这个帖子如何在 xcode 8 中设置 CURRENT PROJECT VERSION https stackoverflow com questions 39673280 how to set current project versio
  • 如何在移动设备上垂直堆叠 div 而在网页版本上保持水平放置?

    我添加了一些 div 标签以在 WordPress 帖子中创建两列 这是我使用的代码 container width 100 one width 50 float left two width 50 float right 我将上面的代码添
  • 如何使用 PHP SoapClient 添加任意命名空间?

    如何使用 PHP SoapClient 添加任意名称空间 命名空间实际上并未在请求中使用 但我认为它阻止了我的消息被正确使用 WSDL 在这里 http abr business gov au abrxmlsearchRPC ABRXMLS