最新消息:文章中包含代码时,请遵守代码高亮规范!

[项目实战][原创][webService]SOAP技术实践

PHP Jay 685浏览 0评论

参照材料

http://www.php.cn/php-weizijiaocheng-373996.html

一:技术背景

SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

WSDL(Web Service Description Language)就是描述XML Web服务的标准XML格式,WSDL由Ariba、Intel、IBM和微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。就其定义来说,你还不能把WSDL当作一种对象接口定义语言,例如,CORBA或COM等应用程序体系结构就会用到对象接口定义语言。 WSDL保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的联系。所以,当我在这篇文章中讨论WSDL的时候,我会假定你把SOAP作为了你的通讯协议。

SOAP和WSDL虽然是web service的两大标准,但是两者并没有必然的联系,都可以独立使用。它们之间的关系就类似HTTP和Html之间的关系。前者是一种协议,后者是对一个Web Server的描述。

二、PHP5下的配置

在php的的配置文件php.ini中,找到

extension=php_soap.dll

然后将前面的;号去掉,然后重启web服务

辅助链接:PHP中安装soap模块 扩展 方法

三、webService接口接入

<?php
header("content-type:text/html;charset=utf-8");
try {
    $client = new SoapClient("http://***.******.com/services/AcceptedBusiness?wsdl");
    print_r($client->__getFunctions());
    print_r($client->__getTypes());  
} catch (SOAPFault $e) {
    print $e;
}
?>

四、webService接口方法调用

 $client->login(array('username' => '', 'pwd' => ''));

五:接口服务实现

1:定义服务接口类-用于声明对外公布提供服务的接口以及接口参数

interface WebService
{
    /**
     * 测试
     *
     * @return string
     */
    function helloWord();

    /**
     * 登录
     *
     * @param string $username
     * @param string $password
     * @return string
     */
    function login($username, $password);
}

2: 生成 WsdlXml文件

composer组件:

需要的composer组件:  "php2wsdl/php2wsdl": "^0.6"  ;
composer require php2wsdl/php2wsdl

组件代码修改使其能够通过接口类:

移除 vendor/php2wsdl/php2wsdl/src/PHPClass2WSDL.php 73行

if (is_string($class) && class_exists($class)) {

生成方法【保存目录需要给可写权限】

    /**
     * 生成 WsdlXml文件
     *
     * @说明 文件生成在web/wsdl目录下
     *
     */
    public function generateWsdlXmlFile()
    {
        include_once 'WebService.php';
        $serviceURT = $this->getUrl('frontend_server_webService');
        $wsdlGenerator = new PHPClass2WSDL('WebService', $serviceURT);
        $wsdlGenerator->generateWSDL(false);
        $wsdlGenerator->save(dirname(dirname(dirname(dirname(__FILE__)))) .'/web/wsdl/WebService.wsdl');
    }

4:实现服务接口类

/**
 * WebService 接口实现
 *
 */

include_once 'WebService.php';

class Service  implements WebService{

    //TODO 接口

    function helloWord()
    {
        return json_encode($this->setError('HelloWord', 0));
    }

    function login($username, $password)
    {
        if(empty($username) || empty($password)){
            return json_encode($this->setError('帐号密码不能为空'));
        }

        return json_encode($this->setError('登录成功', 0 , ['token' => $data['token']]));
    }
}

5:接口对外开放

/**
     * webService
     *
     * @return Response
     */
    public function webServiceAction()
    {
        //TODO 生成WsdlXml
        $service_tool = new ServiceTool($this);
        $service_tool->generateWsdlXmlFile();

        //TODO 生成服务
        include_once dirname(dirname(dirname(__FILE__))). '/Derivative/Service/Service.php';
        $server = new \SoapServer(  dirname(dirname(dirname(dirname(__FILE__)))). '/web/wsdl/WebService.wsdl', array('soap_version' => SOAP_1_2));
        $server->setClass("Service", $this); //注册Service类的所有方法
        $server->handle(); //处理请求

        exit;
    }

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/23333.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Jay的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!