Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用PHP和XML主体创建SOAP调用

使用PHP和XML主体创建SOAP调用
EN

Stack Overflow用户
提问于 2013-03-08 18:30:09
回答 2查看 105.9K关注 0票数 23

我正在尝试使用PHP调用SOAP方法。

下面是我得到的代码:

代码语言:javascript
运行
AI代码解释
复制
$data = array('Acquirer' =>
  array(
    'Id' => 'MyId',
    'UserId' => 'MyUserId',
    'Password' => 'MyPassword'
  ));
$method = 'Echo';
$client = new SoapClient(NULL,
           array('location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
           'uri' => 'http://example.com/wsdl', 'trace' => 1));
$result = $client->$method($data);

下面是它创建的请求:

代码语言:javascript
运行
AI代码解释
复制
  <?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Body>
      <ns1:Echo>
        <param0 xsi:type="ns2:Map">
          <item>
            <key xsi:type="xsd:string">Acquirer</key>
            <value xsi:type="ns2:Map">
              <item>
                <key xsi:type="xsd:string">Id</key>
                <value xsi:type="xsd:string">mcp</value>
              </item>
              <item>
                <key xsi:type="xsd:string">UserId</key>
                <value xsi:type="xsd:string">tst001</value>
              </item>
              <item>
                <key xsi:type="xsd:string">Password</key>
                <value xsi:type="xsd:string">test</value>
              </item>
            </value>
          </item>
        </param0>
      </ns1:Echo>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

下面是我希望请求看起来是这样的:

代码语言:javascript
运行
AI代码解释
复制
  <?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Body>
      <Echo>
        <Acquirer>
          <Id>MyId</Id>
          <UserId>MyUserId</UserId>
          <Password>MyPassword</Password>
        </Acquirer>
      </Echo>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 14:15:01

有几种方法可以解决这个问题。最少的麻烦和几乎你想要的:

代码语言:javascript
运行
AI代码解释
复制
$client = new SoapClient(
    null,
    array(
        'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler',
        'uri' => 'http://example.com/wsdl',
        'trace' => 1,
        'use' => SOAP_LITERAL,
    )
);
$params = new \SoapVar("<Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer>", XSD_ANYXML);
$result = $client->Echo($params);

这将为您提供以下XML:

代码语言:javascript
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl">
    <SOAP-ENV:Body>
        <ns1:Echo>
            <Acquirer>
                <Id>MyId</Id>
                <UserId>MyUserId</UserId>
                <Password>MyPassword</Password>
            </Acquirer>
        </ns1:Echo>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这几乎就是您想要的,除了方法名上的命名空间。我不知道这是不是一个问题。如果是这样的话,你可以进一步修改它。您可以手动将<Echo>标记放在XML字符串中,并通过将'style' => SOAP_DOCUMENT,添加到选项数组来让SoapClient不设置该方法,如下所示:

代码语言:javascript
运行
AI代码解释
复制
$client = new SoapClient(
    null,
    array(
        'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler',
        'uri' => 'http://example.com/wsdl',
        'trace' => 1,
        'use' => SOAP_LITERAL,
        'style' => SOAP_DOCUMENT,
    )
);
$params = new \SoapVar("<Echo><Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer></Echo>", XSD_ANYXML);
$result = $client->MethodNameIsIgnored($params);

这将产生以下请求XML:

代码语言:javascript
运行
AI代码解释
复制
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <Echo>
            <Acquirer>
                <Id>MyId</Id>
                <UserId>MyUserId</UserId>
                <Password>MyPassword</Password>
            </Acquirer>
        </Echo>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

最后,如果你想尝试SoapVar和SoapParam对象,你可以在PHP手册的注释中找到一个很好的参考:http://www.php.net/manual/en/soapvar.soapvar.php#104065。如果你成功了,请让我知道,我失败得很痛苦。

票数 51
EN

Stack Overflow用户

发布于 2013-03-14 04:56:03

首先,您必须指定您希望使用文档文字样式:

代码语言:javascript
运行
AI代码解释
复制
$client = new SoapClient(NULL, array(
    'location' => 'https://example.com/path/to/service',
    'uri' => 'http://example.com/wsdl',
    'trace' => 1,
    'use' => SOAP_LITERAL)
);

然后,您需要将数据转换为SoapVar;我已经编写了一个简单的转换函数:

代码语言:javascript
运行
AI代码解释
复制
function soapify(array $data)
{
        foreach ($data as &$value) {
                if (is_array($value)) {
                        $value = soapify($value);
                }
        }

        return new SoapVar($data, SOAP_ENC_OBJECT);
}

然后,将此转换函数应用于数据:

代码语言:javascript
运行
AI代码解释
复制
$data = soapify(array(
    'Acquirer' => array(
        'Id' => 'MyId',
        'UserId' => 'MyUserId',
        'Password' => 'MyPassword',
    ),
));

最后,调用传递Data参数的服务:

代码语言:javascript
运行
AI代码解释
复制
$method = 'Echo';

$result = $client->$method(new SoapParam($data, 'Data'));
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15300843

复制
相关文章
PHP使用SOAP调用.net的WebService问题
项目的需求,需要和一个.net系统进行数据交换,合作方提供了一个WebService接口。这个与一般的PHP POST或GET传值再查库拿数据的思路有点不一样,需要用到SOAP模块,处理方法也很简单,
wangxl
2018/03/07
1.7K0
Python SOAP 调用
简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web服务(web service)中。SOAP的出现是为了简化网页服务器(Web Server)在从XML数据库中提取数据时,无需花时间去格式化页面,并能够让不同应用程序之间透过HTTP通讯协定,以XML格式互相交换彼此的数据,使其与编程语言、平台和硬件无关 参考:http://zh.wikipedia.org/wiki/SOAP http://www.ibm.com/developerworks/cn/xml/x-sisoap/index.html python的soap包
py3study
2020/01/10
1.9K0
PHP5下WSDL,SOAP调用实现过程
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义 了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
星哥玩云
2022/07/05
9050
soap 返回xml 文件 soap 文件 webservice wsdl
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100557.html原文链接:
全栈程序员站长
2021/05/06
1.3K0
php .asmx,php实现通过soap调用.Net的WebService asmx文件
本文实例讲述了php实现通过soap调用.Net的WebService asmx文件。分享给大家供大家参考,具体如下:
全栈程序员站长
2022/06/27
1.1K0
XML和PHP
1、XML知识 Xml就是可扩展标记语言与html一样,都是通用标记语言。 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
苦咖啡
2018/05/07
1.6K0
soapclient php 扩展,PHP扩展—SOAP[通俗易懂]
SOAP扩展可以用于编写SOAP服务器和客户端,支持 SOAP 1.1, SOAP 1.2 和 WSDL 1.1 规格的子集。
全栈程序员站长
2022/11/16
2K0
jax-ws 生成soap_使用JAX-WS创建SOAP Web服务
有多种创建Web服务的方法。 在本文中,我们将使用JAX-WS创建基于SOAP的Web服务,该服务是XML Web Services的Java API,并将其部署在Tomcat下。
全栈程序员站长
2022/09/14
1.2K0
jax-ws 生成soap_使用JAX-WS创建SOAP Web服务
runC源码分析——主体调用链
本文将简单的对runC的源码调用主体逻辑进行梳理,为跟系统的阅读runC源码。 ##runC总体调用逻辑 下图中,runC源码逻辑跳转流程总体上分为三步: main入口 ——> runC处理 ——>
Walton
2018/04/13
1.6K0
runC源码分析——主体调用链
SOAP UI 使用
转载于:https://my.oschina.net/u/2277088/blog/3024342
全栈程序员站长
2021/07/07
1K0
SOAP UI 使用
使用asp调用.net xml web services
(是不是实际上可以用这个办法调用任何xml web services呢?高人答一下) 最近在做一个web services,由我来写文档。为了方便广大asp用户也可以使用我们的服务,特意在网上搜了半天,发现大致有下面两个办法来通过asp调用.net xml web services。 1. 使用soap toolkit 3.0 2. 使用xmlhttp 我来写个总结,这样以后大家如果遇到这样的问题,如果用搜索搜到我的页面上,那立刻就可以实现自己的方案了。 1. 使用soap toolkit 3.0 如果网站
猿人谷
2018/01/17
2.1K0
理解SOAP和WebService
这篇文章对soap和webService有一个比较好的讲解: https://blog.csdn.net/Pautcher_0/article/details/6798351
全栈程序员站长
2022/09/15
2.6K0
Biztalk 调用带Soap Head WebService的方法
    前天有位网友正好也提到了类似的问题,正好以前我也作过这方面的项目;在Biztalk Orchestration中调用对方发布的WebService;但必须提供定义soap head作做一些处理;在Biztalk Orchestration中定义的soap Port  Request接受的消息只能是传参数,并没有soap head的消息;那要如何将soap head的消息一起传递给webservice呢;     我通过Biztalk的帮助文件可以查到ms-help://MS.BTS.2006/BTS
阿新
2018/04/12
1.7K0
调用wsdl接口 使用xml格式为参数
由于之前代码都是java代码 里面直接调用了java包进行传输xml 所以目前要用kettle进行传输必须拼字符串,发现怎么拼都不对
全栈程序员站长
2021/04/07
2.3K0
如何使用PHP解析XML大文件
如果使用 PHP 解析 XML 的话,那么常见的选择有如下几种:DOM、SimpleXML、XMLReader。如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要把整个文件全部加载才能解析,效率堪忧,相比较而言,SimpleXML 和 XMLReader 更好些,SimpleXML 相对简单,而 XMLReader 相对复杂,但是它可以自定义解析整个过程,特别是流式解析的特点让其效率更高。
LA0WAN9
2021/12/14
3.5K0
php 使用AMQP扩展调用RabbitMq
先试用Docker安装 RabbitMq docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management cons_order.php //配置信息 $conn_args = array( 'host' => '192.168.7.50',
码缘
2020/08/17
2K0
点击加载更多

相似问题

如何在XML主体中使用PHP获取SOAP调用的响应

11

使用带有动态soap主体xml的soap调用web服务。

13

使用SOAP和PHP创建XML节点

13

使用XPath和XML XPath Api获取Soap主体

13

使用SOAP PHP创建XML消息

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档