结合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文件生成类 】

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 知电
  5. * Date: 2018-1-2
  6. * Time: 10:14
  7. */
  8. namespace app\service;
  9. /**
  10. * Copyright (c) 2005, Braulio Jos?Solano Rojas
  11. * All rights reserved.
  12. *
  13. * Redistribution and use in source and binary forms, with or without modification, are
  14. * permitted provided that the following conditions are met:
  15. *
  16. * Redistributions of source code must retain the above copyright notice, this list of
  17. * conditions and the following disclaimer.
  18. * Redistributions in binary form must reproduce the above copyright notice, this list of
  19. * conditions and the following disclaimer in the documentation and/or other materials
  20. * provided with the distribution.
  21. * Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may
  22. * be used to endorse or promote products derived from this software without specific
  23. * prior written permission.
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  26. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  27. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  28. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  30. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  31. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  32. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  33. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  34. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  35. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  36. * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  37. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. *
  39. *
  40. * @version $Id$
  41. * @copyright 2005
  42. */
  43.  
  44. /**
  45. * SoapDiscovery Class that provides Web Service Definition Language (WSDL).
  46. *
  47. * @package SoapDiscovery
  48. * @author Braulio Jos?Solano Rojas
  49. * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas
  50. * @version $Id$
  51. * @access public
  52. * */
  53. class SoapDiscovery
  54. {
  55.  
  56. private $class_name = '';
  57. private $service_name = '';
  58.  
  59. /**
  60. * SoapDiscovery::__construct() SoapDiscovery class Constructor.
  61. *
  62. * @param string $class_name
  63. * @param string $service_name
  64. * */
  65. public function __construct($class_name = '', $service_name = '') {
  66. $this->class_name = $class_name;
  67. $this->service_name = $service_name;
  68. }
  69.  
  70. /**
  71. * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
  72. *
  73. * @return string
  74. * */
  75. public function getWSDL() {
  76. if (empty($this->service_name)) {
  77. throw new \Exception('No service name.');
  78. }
  79. $headerWSDL = "<?xml version=\"1.0\" ?>\n";
  80. $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";
  81. $headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n";
  82.  
  83. if (empty($this->class_name)) {
  84. throw new \Exception('No class name.');
  85. }
  86.  
  87. $class = new \ReflectionClass($this->class_name);
  88.  
  89. if (!$class->isInstantiable()) {
  90. throw new \Exception('Class is not instantiable.');
  91. }
  92.  
  93. $methods = $class->getMethods();
  94.  
  95. $portTypeWSDL = '<portType name="' . $this->service_name . 'Port">';
  96. $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";
  97. $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";
  98. $messageWSDL = '';
  99. foreach ($methods as $method) {
  100. if ($method->isPublic() && !$method->isConstructor()) {
  101. $portTypeWSDL.= '<operation name="' . $method->getName() . "\">\n" . '<input message="tns:' . $method->getName() . "Request\" />\n<output message=\"tns:" . $method->getName() . "Response\" />\n</operation>\n";
  102. $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";
  103. $messageWSDL.= '<message name="' . $method->getName() . "Request\">\n";
  104. $parameters = $method->getParameters();
  105. foreach ($parameters as $parameter) {
  106. $messageWSDL.= '<part name="' . $parameter->getName() . "\" type=\"xsd:string\" />\n";
  107. }
  108. $messageWSDL.= "</message>\n";
  109. $messageWSDL.= '<message name="' . $method->getName() . "Response\">\n";
  110. $messageWSDL.= '<part name="' . $method->getName() . "\" type=\"xsd:string\" />\n";
  111. $messageWSDL.= "</message>\n";
  112. }
  113. }
  114. $portTypeWSDL.= "</portType>\n";
  115. $bindingWSDL.= "</binding>\n";
  116. //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
  117. //生成wsdl文件,将上面的return注释
  118. $fso = fopen(dirname(__FILE__) . '/' . $this->class_name . ".wsdl", "w111");
  119. fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'));
  120. }
  121.  
  122. /**
  123. * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
  124. *
  125. * @return string
  126. * */
  127. public function getDiscovery() {
  128. 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>";
  129. }
  130. }

SoapService.php 【web service 提供的列表】

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 知电
  5. * Date: 2018-1-2
  6. * Time: 10:14
  7. */
  8. namespace app\service;
  9.  
  10. class SoapService
  11. {
  12. public function HelloWorld() {
  13. return "Hello";
  14. }
  15.  
  16. public function Add($a, $b) {
  17. return $a + $b;
  18. }
  19.  
  20. public function SayHello($name){
  21. return 'Hell,'. $name;
  22. }
  23. }

CreatewsController.php 【生成WSDL文件 】

  1. <?php
  2.  
  3. namespace app\controllers;
  4.  
  5. use Yii;
  6. use yii\web\Controller;
  7. use app\service\SoapService;
  8. use app\service\SoapDiscovery;
  9.  
  10. class CreatewsController extends Controller
  11. {
  12. public function actionIndex()
  13. {
  14. $disco = new SoapDiscovery('\app\service\SoapService', 'soap'); //第一个参数是类名(生成的wsdl文件就是以它来命名的),即Service类,第二个参数是服务的名字(这个可以随便写)。
  15. $r = $disco->getWSDL();
  16. }
  17. }

ServiceController.php【注册、调用测试】

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 知电
  5. * Date: 2018-1-2
  6. * Time: 10:16
  7. */
  8. namespace app\controllers;
  9. use Yii;
  10. use yii\web\Controller;
  11. class ServiceController extends Controller
  12. {
  13. public $ws_url = 'http://host.com/service/ws?wsdl'; //服务注册地址
  14. public function init()
  15. {
  16. Yii::$app->getRequest()->enableCsrfValidation = false;
  17. }
  18.  
  19. /**
  20. * 服务地址注册 /service/ws
  21. */
  22. public function actionWs()
  23. {
  24. //设置Yii响应格式为XML
  25. \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
  26. $server = new \SoapServer(dirname(dirname(__FILE__)) . '/\service\app\service\SoapService.wsdl', array('soap_version' => SOAP_1_2));
  27. $server->setClass('\app\service\SoapService'); //注册Service类的所有方法
  28. $server->handle(); //处理请求
  29. }
  30.  
  31. /**
  32. * 测试调用
  33. */
  34. public function actionTest()
  35. {
  36. $client = new \SoapClient($this->ws_url, array(
  37. 'soap_version' => SOAP_1_2,
  38. 'cache_wsdl' => WSDL_CACHE_NONE
  39. ));
  40. echo 'SOAP 类型';
  41. echo '<pre>';
  42. var_dump($client->__getTypes());//获取服务器上数据类型
  43. echo ('</pre>');
  44. echo 'SOAP 方法';
  45. echo '<pre>';
  46. var_dump($client->__getFunctions());//获取服务器上提供的方法
  47. echo ('</pre>');
  48. echo ("执行的结果:");
  49. $result = $client->__soapCall('SayHello',[111]);
  50. var_dump($result);
  51. }
  52. }

备注:生成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的更多相关文章

  1. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

  2. webservice的简单示例的实现步骤

    前段时间在webservice的问题上纠结了很长时间,本来想写在thinkphp的框架里面,可是怎么也实现不了,目前为止也仅仅是学会的没有框架的接口的开发. 在此资源共享一下步骤: 首先我创建的文件有 ...

  3. php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正“办事”的那个,提供一种办事接口的统称. ...

  4. PHP soap Web Service 使用SoapDiscovery.class.php 生成wsdl文件

    PHP soap web service 使用wsdl文件 demo: ============================================================== 服 ...

  5. 在PHP中利用wsdl创建标准webservice

    参照整理: http://bbs.php100.com/read-htm-tid-95228.html http://www.ieliwb.com/wsdl-create-soapdiscovery/ ...

  6. 如何使用PHP实现一个WebService

    WSDL WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问.这种文 ...

  7. 一个php创建webservice,并通过c#调用的真实实例

    最近需要用php创建webservice供C#和JAVA来调用,通过3天的搜索和尝试,终于成功在C#下调用,JAVA的调用还没开始,为防止忘记,在这里记录下来全过程. 本文参考了许多文章,文中也采用了 ...

  8. php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl差别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供 ...

  9. 使用soap实现简单webservice

    在网上看到一些关于用soap实现简单webservice的一些知识,简单整理一下希望对大家有所帮助. 可以给大家看一下我的简单实现的列子,Soap,大家可以到Github上自行下载. 首先说一下web ...

随机推荐

  1. Thread-local storage (TLS)

    线程存储原理:为变量在每一个现存的线程里分配一个实例,需要处理器支持,并不是所有都支持!支持全局的,静态的变量,但不支持局部变量. 关键字 __thread   __thread int i;   e ...

  2. 二叉树 【转】http://blog.csdn.net/sjf0115/article/details/8645991

    //二叉树 #include<iostream> #include<stack> #include<queue> using namespace std; //二叉 ...

  3. 使用node构建一个自己的服务器

    我们做本地服务器,经常会选择Apache.IIS或者Tomcat,当然这些最方便的算是Apache,几乎不需要配置,最多就是配置下端口,亦或者我们想不用localhost,改成其他也是可以的,只要去更 ...

  4. Python 3基础教程2-打印语句和字符串

    本文介绍Python 3中的打印语句和字符串使用,具体练习请看下面的demo.py print ('Hello Python 3!') """文本讲打印语句和字符串打印语 ...

  5. JMeter学习笔记(四) HTTP Cookies 管理器

    有些接口执行时,要求要先登录,此时就需要用到 HTTP Cookies 管理器.不过有些项目是使用的token,即添加HTTP信息头管理器,获取登录后的token,至于token与cookies的区别 ...

  6. 解决display:inline-block;行内块元素出现空白空隙问题

     给他的父元素加:font-size:0px;,   ul { font-size:0px;} li { font-size:16px;}

  7. python-configparser模块,xml.etree模块

    操作键值对文件 #文件db格式为 [section] a = 1 b = 2 [section1] d = 3 c = 4 import configparser #获取所有节点 config = c ...

  8. CodeBlocks X64 SVN 编译版

    CodeBlocks X64 SVN 编译版 采用官方最新的SVN源码编译而来,纯64位的,所以32位系统是不能使用的.字体使用的是微软的YaHei UI字体,如果有更好的字节建议,可以留言. 由于直 ...

  9. URAL 1732. Ministry of Truth ( KMP 多模式串匹配 )

    问在第一个串中删掉几个字符能否得到第二个串.注意在第二个串中不连续的单词在第一个串中也必须不连续. 一组数据: Input: abababbbbababbb aba ab Output: I HAVE ...

  10. 更换checkbox的原有样式

    通常情况下,各个浏览器对的样式不一致,并且不那么美观.所以有时候设计需要我们更换原有的样式: html: <span><input type="checkbox" ...