最近有个项目要对接电力平台,对方用的是webservice,折腾了好几天终于搞定,这里做个记录
首先需要一个工具 econea/nusoap,想查看具体信息可以去这里,https://github.com/f00b4r/nusoap
composer require econea/nusoap
service端,建立server控制器,定义了一个hello方法和name参数
<?php
namespace app\admin\controller;
use app\BaseController;
use think\App;
class Server extends BaseController
{
public function __construct(App $app){
parent::__construct($app);
}
public function index(){
$server = new \nusoap_server();
// 避免乱码
$server->soap_defencoding = 'UTF-8';
$server->decode_utf8 = false;
$server->xml_encoding = 'UTF-8';
$server->configureWSDL ('webservice'); // 打开 wsdl 支持
$server->register('hello',
array ("name" => "xsd:string" ), // 参数,默认为 "xsd:string"
array ("return" => "xsd:string" ) // 返回值,默认为 "xsd:string"
);
//service 处理客户端输入的数据
@$server->service(file_get_contents("php://input"));
die;
}
}
现在可以访问服务端啦,http://xxx.com/admin/server
看到以下画面,就代表服务端搭建成功啦
还可以访问 http://xxx.com/admin/server?wsdl,可以理解为接口文档,是一个自动生成的xml文件,长这样
我们服务端是跑起来了,但是服务端定义的hello方法还没实现,经过测试,hello方法不能写在控制器中,要写在框架的公共函数文件里,也就是这里:项目名称\app\common.php,也可以自己定义一个文件,框架能访问到这个方法就行
function hello($name) {
return "Hello, { $name } !";
}
接下来写客户端,新建一个client的controller
<?php
namespace app\admin\controller;
use app\BaseController;
use think\App;
class Client extends BaseController
{
public function __construct(App $app){
parent::__construct($app);
}
public function index(){
$client = new \nusoap_client('http://xxx.com/admin/server?wsdl');
//如果需要加载证书,加上这部分
$client->scheme = 'https';
$cer_file = root_path().'cert/webclient.pem';
$client->setCredentials('','','certificate',array(
"cainfofile" => $cer_file,
"passphrase" => "",
"verifypeer" => 0, //OPTIONAL
"verifyhost" => 0 //OPTIONAL
));
//如果需要加载证书,加上这部分
$client->soap_defencoding = 'UTF-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'UTF-8';
//参数转为数组形式传递
$paras=array('name'=>'张三');
//目标方法没有参数时,可省略后面的参数
//如果需要传命名空间的话,call的第三个参数传命名空间
$result=$client->call('hello',$paras);
//检查错误,获取返回值
if (!$err=$client->getError()) {
echo "返回结果:",$result;
} else {
echo "调用出错:",$err;
}
}
}
接下来测试一下,访问http://xxx.com/admin/client
恭喜你,在tp6里面搭建了一个webservice的服务器和客户端