当前位置:首页 > 技术 > 正文内容

使用PHP的cURL和SoapClient实现WebService同步调用

访客 技术 2026年6月1日 1

一、WebService基础概念

WebService是一种跨平台、跨语言的远程调用技术。为了实现不同系统间的数据交换,WebService应运而生。SOAP、WSDL和UDDI构成了WebService的核心技术。

  • SOAP(简单对象访问协议):基于XML的数据传输协议,用于定义数据传输格式。
  • WSDL(WebService描述语言):描述服务接口、数据类型、服务地址等信息,可通过工具解析。
  • UDDI(统一描述、发现和集成):用于存储和查找WebService描述文件,充当服务目录。

这些技术虽新,但其实基于已有技术实现,理解其原理后即可轻松上手。

二、PHP实现同步调用

由于同步调用需求,我们可以使用cURL来实现。以下是示例代码:

private function httpRequestXml($url, $data = null, $headers = null) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    if (!empty($data)) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    if (!empty($headers)) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:app="http://siebel.com/Voucher/Apply">
        <soapenv:Header/>
        <soapenv:Body>
            <app:VoucherApply_Input>
                <app:count>1</app:count>
                <app:memberNumber>'.$this->memberNumber.'</app:memberNumber>
            </app:VoucherApply_Input>
        </soapenv:Body>
    </soapenv:Envelope>';
$headers[] = 'Content-Type: text/xml';
$headers[] = 'SOAPAction: "document/http://siebel.com/Voucher/Apply:VoucherApply"';
$result = $this->httpRequestXml($url, $xml, $headers);
if (strpos($result, "<ns:flag>S</ns:flag>")) {
    // 处理成功响应
}

PHP5实现方法

  1. 启用Soap扩展: 在php.ini中找到extension=php_soap.dll,去掉注释符号,重启PHP服务。

  2. 获取服务接口信息

try {
    $client = new SoapClient("http://example.com/services?wsdl");
    print_r($client->__getFunctions()); // 获取可用方法
    print_r($client->__getTypes());    // 获取数据类型
} catch (SoapFault $e) {
    echo $e->getMessage();
}
  1. 调用服务方法
try {
    $client = new SoapClient('http://example.com/services?wsdl');
    $xml = "<xml>...</xml>";
    $result = $client->serviceMethod($xml);
    print_r($result);
} catch (SoapFault $e) {
    print_r('错误:' . $e->getMessage());
}

三、WSDL文件详解

WSDL文件定义了WebService的接口和数据格式。以下是WSDL文件示例:

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
             targetNamespace="http://example.com/services">
    <types>
        <xsd:schema targetNamespace="http://example.com/services">
            <xsd:element name="ServiceRequest" type="xsd:string"/>
            <xsd:element name="ServiceResponse" type="xsd:string"/>
        </xsd:schema>
    </types>
    <message name="RequestMessage">
        <part name="ServiceRequest" element="tns:ServiceRequest"/>
    </message>
    <message name="ResponseMessage">
        <part name="ServiceResponse" element="tns:ServiceResponse"/>
    </message>
    <portType name="ServicePortType">
        <operation name="ServiceOperation">
            <input message="tns:RequestMessage"/>
            <output message="tns:ResponseMessage"/>
        </operation>
    </portType>
    <binding name="ServiceBinding" type="tns:ServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <operation name="ServiceOperation">
            <soap:operation soapAction="http://example.com/services/ServiceOperation"/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="ExampleService">
        <port binding="tns:ServiceBinding" name="ServicePort">
            <soap:address location="http://example.com/services"/>
        </port>
    </service>
</definitions>

四、使用cURL调用WebService获取天气信息

以下是一个使用cURL调用天气WebService的示例:

<?php
$data = 'theCityCode=864&theUserID=';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$headers = array(
    'Content-Type: application/x-www-form-urlencoded;charset=utf-8',
    'Content-Length: ' . strlen($data),
    'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);
if (!curl_errno($curl)) {
    echo $response;
} else {
    echo 'curl 错误:' . curl_errno($curl);
}
curl_close($curl);
?>

以上代码展示了如何使用cURL调用WebService接口,获取天气信息。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。