webservice接口-PHP服务端与PHP客户端

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 用来调用客户端

代码地址

  • 直接将WebserviceDemo这个文件放在php环境下 最好在根目录
  • github下载地址
  • 如果有问题请联系 [email protected] 欢迎斧正

简述Webservice soap wsdl之间的关系

  1. Webservice业务实现者 可以看成一台电视
  2. wsdl 业务描述者 可以看成电视的使用说明能够接收那些命令
  3. SOAP 请求规范 可以看成遥控器和电视之间的一种规范,只有满足这种规范才能请求到对应的Webservice

构建服务端

ServerImp.php 客户端访问传入的数据最终会传入returnData这个方法


/**
 * 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 用来分辨是客户端的请求还是浏览器的请求,作出不同的处理


/**
 * 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 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 "

"
; }catch (SoapFault $fault){ echo "\n"; echo 'Error Message4: ' . $fault->getMessage(); echo '----------------------------------------'; echo $client -> __getLastResponse (); }

SOAP下的Client此处不再详细描述

你可能感兴趣的:(接口,php)