yii2实现WebService 使用 SoapDiscovery
结合SoapDiscovery实现简单的WebService服务
1 修改php.ini文件
php_soap.dll
extension=php_soap.dll
2 WebService 实现主要步骤
- 生成wsdl描述文件
- 使用SoapServer注册服务
- 使用SoapClient调用服务
3 目录结构以及代码
根目录
==service目录
||== SoapDiscovery.php 【Soap wsdl文件生成类 】
||==SoapService.php 【web service 提供的列表】
==controllers目录
||==CreatewsController.php 【生成WSDL文件 】
||==ServiceController【注册、调用测试】
SoapDiscovery.php 【Soap wsdl文件生成类 】
- <?php
- /**
- * Created by PhpStorm.
- * User: 知电
- * Date: 2018-1-2
- * Time: 10:14
- */
- namespace app\service;
- /**
- * Copyright (c) 2005, Braulio Jos?Solano Rojas
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of
- * conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- * Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may
- * be used to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- * @version $Id$
- * @copyright 2005
- */
- /**
- * SoapDiscovery Class that provides Web Service Definition Language (WSDL).
- *
- * @package SoapDiscovery
- * @author Braulio Jos?Solano Rojas
- * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas
- * @version $Id$
- * @access public
- * */
- class SoapDiscovery
- {
- private $class_name = '';
- private $service_name = '';
- /**
- * SoapDiscovery::__construct() SoapDiscovery class Constructor.
- *
- * @param string $class_name
- * @param string $service_name
- * */
- public function __construct($class_name = '', $service_name = '') {
- $this->class_name = $class_name;
- $this->service_name = $service_name;
- }
- /**
- * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
- *
- * @return string
- * */
- public function getWSDL() {
- if (empty($this->service_name)) {
- throw new \Exception('No service name.');
- }
- $headerWSDL = "<?xml version=\"1.0\" ?>\n";
- $headerWSDL.= "<definitions name=\"$this->service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n";
- $headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n";
- if (empty($this->class_name)) {
- throw new \Exception('No class name.');
- }
- $class = new \ReflectionClass($this->class_name);
- if (!$class->isInstantiable()) {
- throw new \Exception('Class is not instantiable.');
- }
- $methods = $class->getMethods();
- $portTypeWSDL = '<portType name="' . $this->service_name . 'Port">';
- $bindingWSDL = '<binding name="' . $this->service_name . 'Binding" type="tns:' . $this->service_name . "Port\">\n<soap:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\" />\n";
- $serviceWSDL = '<service name="' . $this->service_name . "\">\n<documentation />\n<port name=\"" . $this->service_name . 'Port" binding="tns:' . $this->service_name . "Binding\"><soap:address location=\"http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "\" />\n</port>\n</service>\n";
- $messageWSDL = '';
- foreach ($methods as $method) {
- if ($method->isPublic() && !$method->isConstructor()) {
- $portTypeWSDL.= '<operation name="' . $method->getName() . "\">\n" . '<input message="tns:' . $method->getName() . "Request\" />\n<output message=\"tns:" . $method->getName() . "Response\" />\n</operation>\n";
- $bindingWSDL.= '<operation name="' . $method->getName() . "\">\n" . '<soap:operation soapAction="urn:' . $this->service_name . '#' . $this->class_name . '#' . $method->getName() . "\" />\n<input><soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</input>\n<output>\n<soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</output>\n</operation>\n";
- $messageWSDL.= '<message name="' . $method->getName() . "Request\">\n";
- $parameters = $method->getParameters();
- foreach ($parameters as $parameter) {
- $messageWSDL.= '<part name="' . $parameter->getName() . "\" type=\"xsd:string\" />\n";
- }
- $messageWSDL.= "</message>\n";
- $messageWSDL.= '<message name="' . $method->getName() . "Response\">\n";
- $messageWSDL.= '<part name="' . $method->getName() . "\" type=\"xsd:string\" />\n";
- $messageWSDL.= "</message>\n";
- }
- }
- $portTypeWSDL.= "</portType>\n";
- $bindingWSDL.= "</binding>\n";
- //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
- //生成wsdl文件,将上面的return注释
- $fso = fopen(dirname(__FILE__) . '/' . $this->class_name . ".wsdl", "w111");
- fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'));
- }
- /**
- * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
- *
- * @return string
- * */
- public function getDiscovery() {
- return "<?xml version=\"1.0\" ?>\n<disco:discovery xmlns:disco=\"http://schemas.xmlsoap.org/disco/\" xmlns:scl=\"http://schemas.xmlsoap.org/disco/scl/\">\n<scl:contractRef ref=\"http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "?wsdl\" />\n</disco:discovery>";
- }
- }
SoapService.php 【web service 提供的列表】
- <?php
- /**
- * Created by PhpStorm.
- * User: 知电
- * Date: 2018-1-2
- * Time: 10:14
- */
- namespace app\service;
- class SoapService
- {
- public function HelloWorld() {
- return "Hello";
- }
- public function Add($a, $b) {
- return $a + $b;
- }
- public function SayHello($name){
- return 'Hell,'. $name;
- }
- }
CreatewsController.php 【生成WSDL文件 】
- <?php
- namespace app\controllers;
- use Yii;
- use yii\web\Controller;
- use app\service\SoapService;
- use app\service\SoapDiscovery;
- class CreatewsController extends Controller
- {
- public function actionIndex()
- {
- $disco = new SoapDiscovery('\app\service\SoapService', 'soap'); //第一个参数是类名(生成的wsdl文件就是以它来命名的),即Service类,第二个参数是服务的名字(这个可以随便写)。
- $r = $disco->getWSDL();
- }
- }
ServiceController.php【注册、调用测试】
- <?php
- /**
- * Created by PhpStorm.
- * User: 知电
- * Date: 2018-1-2
- * Time: 10:16
- */
- namespace app\controllers;
- use Yii;
- use yii\web\Controller;
- class ServiceController extends Controller
- {
- public $ws_url = 'http://host.com/service/ws?wsdl'; //服务注册地址
- public function init()
- {
- Yii::$app->getRequest()->enableCsrfValidation = false;
- }
- /**
- * 服务地址注册 /service/ws
- */
- public function actionWs()
- {
- //设置Yii响应格式为XML
- \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
- $server = new \SoapServer(dirname(dirname(__FILE__)) . '/\service\app\service\SoapService.wsdl', array('soap_version' => SOAP_1_2));
- $server->setClass('\app\service\SoapService'); //注册Service类的所有方法
- $server->handle(); //处理请求
- }
- /**
- * 测试调用
- */
- public function actionTest()
- {
- $client = new \SoapClient($this->ws_url, array(
- 'soap_version' => SOAP_1_2,
- 'cache_wsdl' => WSDL_CACHE_NONE
- ));
- echo 'SOAP 类型';
- echo '<pre>';
- var_dump($client->__getTypes());//获取服务器上数据类型
- echo ('</pre>');
- echo 'SOAP 方法';
- echo '<pre>';
- var_dump($client->__getFunctions());//获取服务器上提供的方法
- echo ('</pre>');
- echo ("执行的结果:");
- $result = $client->__soapCall('SayHello',[111]);
- var_dump($result);
- }
- }
备注:生成WSDL文件后,需把WSDL里面的 address location更改一下变为实际的注册地址[参考ServiceController.php说明]。
eg:
官方文档 http://www.yiichina.com/tutorial/817
php 调用WebService 的常见方法 http://blog.csdn.net/sagatx/article/details/9318497
yii2实现WebService 使用 SoapDiscovery的更多相关文章
- php中创建和调用webservice接口示例
php中创建和调用webservice接口示例 这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...
- webservice的简单示例的实现步骤
前段时间在webservice的问题上纠结了很长时间,本来想写在thinkphp的框架里面,可是怎么也实现不了,目前为止也仅仅是学会的没有框架的接口的开发. 在此资源共享一下步骤: 首先我创建的文件有 ...
- php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类
1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求: Web Service是真正“办事”的那个,提供一种办事接口的统称. ...
- PHP soap Web Service 使用SoapDiscovery.class.php 生成wsdl文件
PHP soap web service 使用wsdl文件 demo: ============================================================== 服 ...
- 在PHP中利用wsdl创建标准webservice
参照整理: http://bbs.php100.com/read-htm-tid-95228.html http://www.ieliwb.com/wsdl-create-soapdiscovery/ ...
- 如何使用PHP实现一个WebService
WSDL WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问.这种文 ...
- 一个php创建webservice,并通过c#调用的真实实例
最近需要用php创建webservice供C#和JAVA来调用,通过3天的搜索和尝试,终于成功在C#下调用,JAVA的调用还没开始,为防止忘记,在这里记录下来全过程. 本文参考了许多文章,文中也采用了 ...
- php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类
1. web service普及: Webservice soap wsdl差别之个人见解 Web Service实现业务诉求: Web Service是真正"办事"的那个,提供 ...
- 使用soap实现简单webservice
在网上看到一些关于用soap实现简单webservice的一些知识,简单整理一下希望对大家有所帮助. 可以给大家看一下我的简单实现的列子,Soap,大家可以到Github上自行下载. 首先说一下web ...
随机推荐
- Thread-local storage (TLS)
线程存储原理:为变量在每一个现存的线程里分配一个实例,需要处理器支持,并不是所有都支持!支持全局的,静态的变量,但不支持局部变量. 关键字 __thread __thread int i; e ...
- 二叉树 【转】http://blog.csdn.net/sjf0115/article/details/8645991
//二叉树 #include<iostream> #include<stack> #include<queue> using namespace std; //二叉 ...
- 使用node构建一个自己的服务器
我们做本地服务器,经常会选择Apache.IIS或者Tomcat,当然这些最方便的算是Apache,几乎不需要配置,最多就是配置下端口,亦或者我们想不用localhost,改成其他也是可以的,只要去更 ...
- Python 3基础教程2-打印语句和字符串
本文介绍Python 3中的打印语句和字符串使用,具体练习请看下面的demo.py print ('Hello Python 3!') """文本讲打印语句和字符串打印语 ...
- JMeter学习笔记(四) HTTP Cookies 管理器
有些接口执行时,要求要先登录,此时就需要用到 HTTP Cookies 管理器.不过有些项目是使用的token,即添加HTTP信息头管理器,获取登录后的token,至于token与cookies的区别 ...
- 解决display:inline-block;行内块元素出现空白空隙问题
给他的父元素加:font-size:0px;, ul { font-size:0px;} li { font-size:16px;}
- python-configparser模块,xml.etree模块
操作键值对文件 #文件db格式为 [section] a = 1 b = 2 [section1] d = 3 c = 4 import configparser #获取所有节点 config = c ...
- CodeBlocks X64 SVN 编译版
CodeBlocks X64 SVN 编译版 采用官方最新的SVN源码编译而来,纯64位的,所以32位系统是不能使用的.字体使用的是微软的YaHei UI字体,如果有更好的字节建议,可以留言. 由于直 ...
- URAL 1732. Ministry of Truth ( KMP 多模式串匹配 )
问在第一个串中删掉几个字符能否得到第二个串.注意在第二个串中不连续的单词在第一个串中也必须不连续. 一组数据: Input: abababbbbababbb aba ab Output: I HAVE ...
- 更换checkbox的原有样式
通常情况下,各个浏览器对的样式不一致,并且不那么美观.所以有时候设计需要我们更换原有的样式: html: <span><input type="checkbox" ...