如何用PHP Curl调用Apache上Delphi构建的SOAP服务echoDouble函数?
Delphi SOAP服务PHP Curl调用地址及实现方案
正确调用地址说明
你不需要在URL中指定方法名或wsdl路径,直接使用服务的入口地址即可:http://127.0.0.1:81/xyz/mod_webbroker.dll
SOAP请求是通过POST方式向这个地址发送符合WSDL规范的XML请求体,而非通过URL路径指定方法。
具体PHP Curl实现步骤
获取WSDL关键信息
访问http://127.0.0.1:81/xyz/mod_webbroker.dll?wsdl,找到:targetNamespace属性值(即接口命名空间,通常为http://tempuri.org/或自定义值)echoDouble方法的参数定义(比如参数名是否为Value)
构造SOAP请求XML
根据WSDL信息构造请求体,示例如下:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tempuri.org/"> <soap:Body> <ns:echoDouble> <ns:Value>3.14</ns:Value> <!-- 替换为实际要传递的数值 --> </ns:echoDouble> </soap:Body> </soap:Envelope>
- PHP Curl代码实现
<?php // SOAP服务入口地址 $serviceUrl = 'http://127.0.0.1:81/xyz/mod_webbroker.dll'; // 从WSDL中获取的命名空间 $namespace = 'http://tempuri.org/'; // 构造SOAP请求XML $requestXml = <<<XML <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="{$namespace}"> <soap:Body> <ns:echoDouble> <ns:Value>3.14</ns:Value> </ns:echoDouble> </soap:Body> </soap:Envelope> XML; // 初始化Curl $curl = curl_init($serviceUrl); // 设置Curl请求参数 curl_setopt_array($curl, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $requestXml, CURLOPT_HTTPHEADER => [ 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: "' . $namespace . 'echoDouble"' // 匹配命名空间+方法名 ], CURLOPT_RETURNTRANSFER => true ]); // 执行请求并处理响应 $response = curl_exec($curl); if (curl_errno($curl)) { die('Curl请求错误: ' . curl_error($curl)); } // 输出或解析响应XML echo $response; // 关闭Curl curl_close($curl); ?>
关键注意事项
- 命名空间必须与WSDL中的
targetNamespace完全一致,不能写错 SOAPAction头的格式要正确,若WSDL中operation定义了soapAction属性,直接使用该值即可- 请求XML中的参数名、层级结构必须严格匹配WSDL里的定义
内容的提问来源于stack exchange,提问作者lorife
相关产品推荐
相关产品推荐

