1. 准备工作
在 php 中实现 webservice,需要先确认以下几点:
- 确认 php 版本支持 SoapClient 模块。可以通过 phpinfo() 函数检查。
- 编写 wsdl 文件,定义 webservice 的函数、参数和返回值等信息。
2. 创建 wsdl 文件
创建 webservice 所需的 wsdl 文件需要遵循 WSDL(Web Services Description Language)规范。wsdl 文件的内容很重要,它告诉调用方有哪些接口可用,接口的输入输出参数是什么。
示例 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" xmlns:tns="http://example.com/stockquote.wsdl" targetNamespace="http://example.com/stockquote.wsdl">
<message name="GetLastTradePriceInput">
<part name="symbol" type="xsd:string"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="price" type="xsd:float"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteBinding" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
其中:
message
是方法的输入参数和输出参数。portType
定义WebService的接口。operation
指定了方法的细节,比如输入、输出类型等。binding
指向并描述了特定的传输协议和消息封装方式(常用:soap:binding)。service
定义 webservice 能够用哪些协议(bindings)访问,以及访问的具体位置。
3. 编写服务器端代码
php 中提供 SoapServer 类来实现服务器端代码。代码基本思路如下:
<?php
class StockQuote {
/**
* @param string $symbol
* @return float
*/
public function GetLastTradePrice($symbol) {
// 实现具体的业务逻辑,进行数据处理
$price = 10.0;
return $price;
}
}
$server = new SoapServer('stockquote.wsdl', array('soap_version' => SOAP_1_2));
$server->setClass('StockQuote');
$server->handle();
其中:
SoapServer()
构造函数中第一个参数指定 wsdl 文件的位置,第二个参数指定SOAP协议的版本。setClass()
指定 webservice 中包装的具体类名称。handle()
开始对外提供 webservice 接口,接收请求并返回结果。
4. 编写客户端代码
php 中提供 SoapClient 类来实现客户端代码。代码基本思路如下:
<?php
$client = new SoapClient("stockquote.wsdl",array(
'location'=>'http://example.com/stockquote',
'uri'=>'http://example.com/stockquote'
));
$res = $client->GetLastTradePrice("GOOG");
echo $res;
其中:
SoapClient()
构造函数中第一个参数指定 wsdl 文件的位置,第二个参数指定 webservice 的端点地址和命名空间.。$client->GetLastTradePrice()
表示调用webservice中的GetLastTradePrice
方法,并传递"GOOG"
参数。
5. 示例说明
以下示例基于一个简单的计算器 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" xmlns:tns="http://localhost/WebService/TestWebService.asmx" targetNamespace="http://localhost/WebService/TestWebService.asmx">
<message name="AddOneInput">
<part name="num" type="xsd:int"/>
</message>
<message name="AddOneOutput">
<part name="result" type="xsd:int"/>
</message>
<portType name="TestWeb">
<operation name="AddOne">
<input message="tns:AddOneInput"/>
<output message="tns:AddOneOutput"/>
</operation>
</portType>
<binding name="TestWebSoap" type="tns:TestWeb">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="AddOne">
<soap:operation soapAction="http://localhost/WebService/TestWebService.asmx/AddOne"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="TestWebService">
<port name="TestWebSoap" binding="tns:TestWebSoap">
<soap:address location="http://localhost/WebService/TestWebService.asmx"/>
</port>
</service>
</definitions>
服务器端代码:
<?php
require_once('lib/nusoap.php');
function AddOne($num)
{
$num++;
return array("result" => $num);
}
$server = new soap_server();
$server->configureWSDL('TestWebService', 'http://localhost/WebService/TestWebService.asmx');
$server->wsdl->schemaTargetNamespace = 'http://localhost/WebService/TestWebService.asmx';
$server->register('AddOne',
array('num'=>'xsd:int'),
array('result'=>'xsd:int'),
'http://localhost/WebService/TestWebService.asmx',
'http://localhost/WebService/TestWebService.asmx#AddOne',
'rpc',
'encoded',
'Add one to input parameter and return');
$server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '');
?>
客户端代码:
<?php
require_once('lib/nusoap.php');
$num = 5;
$client = new nusoap_client('http://localhost/WebService/TestWebService.asmx?wsdl', true);
$result = $client->call('AddOne', array('num'=>$num));
echo ($result["result"]);
?>
以上就是实现 PHP 中 webservice 的完整攻略,其中包括了代码的编写流程和基本思路。可以根据实际需求进行相应的修改,实现自己的 webservice 接口。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现webservice实例 - Python技术站