webservice接口-PHP服务端与PHP客户端
目录结构
- demo
- SERVER 服务端代码
- Server.php
- ServerImp.php 对外服务请求
- SoapDiscovery.php 用于生成wsdl文件
- SOAP
- Client.php 封装好的soap客户端
- XML
- Array2XML.php 数组转XML
- XML2Array.php XML转数组
- CLIENT
- Client.php 用来调用客户端
- SERVER 服务端代码
代码地址
- 直接将WebserviceDemo这个文件放在php环境下 最好在根目录
- github下载地址
- 如果有问题请联系 newrex@qq.com 欢迎斧正
简述Webservice soap wsdl之间的关系
- Webservice业务实现者 可以看成一台电视
- wsdl 业务描述者 可以看成电视的使用说明能够接收那些命令
- SOAP 请求规范 可以看成遥控器和电视之间的一种规范,只有满足这种规范才能请求到对应的Webservice
构建服务端
ServerImp.php 客户端访问传入的数据最终会传入returnData这个方法
<?php
/**
* Created by PhpStorm.
* User: rex
* Date: 2017/7/5 0005
* Time: 上午 10:06
*/
include_once '../XML/XML2Array.php';
include_once '../XML/Array2XML.php';
class ServerImp{
/**
* returnData
* @param string $xml
* @return string
* @soap
*/
public function returnData($xml){
//防止超时
@set_time_limit(3000);
@ini_set('memory_limit', '-1');
//把客户端传来的xml解析成数组
$postXmlData = XML2Array::createArray($xml);
$token = $postXmlData['Data']['Token'];
$result = array();
if(!empty($token)){
$result['token'] = 'server'.$token;
$result['status'] = 'success';
}else{
$result['status'] = 'error';
}
$result = Array2XML::createXML('Result',$result);
$xml = $result->saveXML();
//返回结果转换成xml
return $xml;
}
}
Server.php 用来分辨是客户端的请求还是浏览器的请求,作出不同的处理
<?php
/**
* Created by PhpStorm.
* User: rex(腾飞的鱼)
* Date: 2017/7/5 0005
* Time: 下午 1:52
*/
define('SOAP_MODEL', 1);// 1:wsdl模式 2:no-wsdl模式
include_once '../SERVER/SoapDiscovery.php';
include_once '../SERVER/ServerImp.php';
$soap = new SoapDiscovery('ServerImp','ServerImp');
// 创建 WSDL 服务
//如果是客户端调用会访问两次此处,第一次是get用来生成wsdl文件,第二次是post用来调用webservice服务
//如果是链接访问第一次会生成wsdl并且在页面输出wsdl文件内容,第二次访问就直接输出wsdl文件内容
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
@set_time_limit(3000);
@ini_set('memory_limit', '-1');
$options['cache_wsdl'] = WSDL_CACHE_MEMORY;
if (SOAP_MODEL == '1') {
$wsdl = 'ServerImp.wsdl';
// WSDL 模式不用传 uri 参数,但传了也不会有问题
} else {
$options['uri'] = 'http://'.$_SERVER['SERVER_NAME'];
$wsdl = null;
}
try {
$server = new SoapServer($wsdl, $options);
$server->setClass('ServerImp');
$server->handle();
}catch (SoapFault $fault){
echo 'Error Message5: ' . $fault->getMessage();
}
} else {
// 查看 WSDL xml,删除以下程序就相当于 non-WSDL 模式
header('Content-type: text/xml');
if (isset($_SERVER['QUERY_STRING']) &&
(strcasecmp($_SERVER['QUERY_STRING'], 'wsdl') == 0 || strpos($_SERVER['QUERY_STRING'], 'wsdl') !== false)) {
echo $soap->getWSDL();
} else {
echo file_get_contents('ServerImp.wsdl');
}
}
SoapDiscovery.php 用于生成wsdl文件此处不做详细描述
构建客户端
CLIENT下的Client.php 构建参数传入token到服务端
<?php
/**
* PHP SOAP Web-service 测试文件
*/
@set_time_limit(3000);
@ini_set('memory_limit', '-1');
include '../SOAP/Client.php';
include_once '../XML/XML2Array.php';
include_once '../XML/Array2XML.php';
$params = array(
'serverIP' => '127.0.0.1',//ip
'serverPort' => '80',//端口
'serverDir' => '/WebserviceDemo/SERVER/Server.php',
'mode' => 'wsdl',
);
$clientClass = new Client($params);
$client = $clientClass->getClient();
ini_set('date.timezone','Asia/Shanghai');
try{
header("Content-type:text/html;charset=utf-8");
$functions = $client->__getFunctions();
var_dump ($functions);
$Source = array();
$Source['Token'] = 'my name id token';
$result = Array2XML::createXML('Data', $Source);
$xml = $result->saveXML();
$result = $client->__soapCall('returnData', array($xml));
$result = XML2Array::createArray($result);
print_r($result);
echo "<br><br>";
}catch (SoapFault $fault){
echo "\n";
echo 'Error Message4: ' . $fault->getMessage();
echo '----------------------------------------';
echo $client -> __getLastResponse ();
}
SOAP下的Client此处不再详细描述