WebService服务

了解WebService

通俗的说按一定的XML格式,调用远程服务器的方法且服务器按一定的格式返回XML内容

"一定的格式"----SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议

"远程服务器"----一般通过HTTP协议来传递消息

总结:WebService == HTTP协议 + Soap格式的XML

<?php
## PHP客户端请求WebService
#修改PHP.ini,打开soap扩展
#extension=php_soap.dll
//利用soapClinet来请求webServer服务器
//
//客户端通过wsdl,即可了解webservice的可调用方法及参数的细节
$client = new SoapClient("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL");

//var_dump($client->__getFunctions()); //得到webservice有哪些方法可以调用
header('content-type:text/html;charset=utf-8');
print_r($client->getMobileCodeInfo(array('mobileCode'=>18620281475))); 

搭建WebService服务器

wsdl是什么?

wsdl是WebService的规格说明书,详细阐述了WebService提供的

服务[service]--下的-->

频道[port]

阐述了[porttype]--下的-->

操作[operation]--下的-->

消息[message]--下的-->

类型[type]

1.新建一个xml文档,wsdl.xml文档,完善规格说明书。

2.用soapService载入xml文件。

<?php
function test($str){
   return 'webservice' . $str;
}

$server = soapServer('./wsdl.xml');  //按照wsdl的说明,来创建服务器
$server->addFunction('test');  //注册函数test

$server->handle(); 

3.客户端调用

<?php

$client = new soapClient('http://localhost/test/wsdl.xml');
//print_r($client->__callFunctions());

echo $client->test('hello world'); 

XML-RPC调用

服务器端,php要打开php_xmlrpc扩展

<?php
//rpc-server.php
#XML-RPC 可以理解为简化版的soap,对数据的包装相对简洁

function hello(){
    return 'hello world';    
}
/*
注意,rpc服务器在调用函数时,传的参数是这样的:
array(a=>'函数名',1=>array(实参1,实参2,...实参N),2=>NULL)
 */
function sum($method,$args,$extra){
    return array_sum($args);
}

//创建RPC服务器
$server = xmlrpc_server_create();
//把用户写的函数注册到RPC服务器中
xmlrpc_server_register_method($server,'hello','hello');
xmlrpc_server_register_method($server,'sum','sum');

//收取POST请求(内容是XML格式)
$request = $HTTP_RAW_POST_DATA;

//调用相关的方法
$response = xmlrpc_server_call_method($server,$request,null);

//输出
header('content-type:text/xml');
echo $response;

//销毁XML-RPC服务器资源
xmlrpc_server_destroy($server); 

客户端

<?php

class rpcclient{
    protected $url;
    public function __construct($url){
        $this->url = $url;
    }
    protected function __query($request){
        $context = stream_context_create(
            array(
                'http'=>array(
                    'method'=>'POST',
                    'header'=>'content-type: text/xml',
                    'content'=>$request
                    )
                )
            );
        $xml = file_get_contents($this->url,false,$context);
        return xmlrpc_decode($xml);
    }
    public function __call($method,$args){
        $request = xmlrpc_encode_request($method, $args);
        return $this->__query($request);
    }
}

$client = new rpcclient('http://localhost/test/rpc-server.php');
//echo $client->hello();
var_dump($client->sum(4,5,6)); 

WebService 诞生十几年了,最初是IBM、微软比较热心在推,一直也不温不火,究其原因还是WebService实在太笨重了,SOAP信封格式书写麻烦,开发速度 慢。尤其是2000年以后,伴随着Web和互联网的快速发展,技术的变迁,无不向着"快速开发"发展,因此RESTful风格逐渐流行起来,(简言之即用 HTTP协议的PUT DELETE GET POST 方法与服务器交换JSON)。

再后来,大伙儿干脆连PUT、DELETE都懒得用,直接用GET和POST,并用JSON交流数据,就是现在常用的API,JSON比起XML,可读性要好很多,解析规则也简单。

但WebService也有其优势,比如

XML可以对输入输出的类型做严格的说明,如int,double

而JSON则不能精确说明数据类型,比如:

{price:12580}

在json里,你无法知道这个价格是int,float还是double

因此,在某些业务复杂,文档性和正确性要求高的领域(如ERP数学运算,天文运算),WebService还是有用武之地的。

 

posted on 2016-10-05 20:24  gimin  阅读(181)  评论(0)    收藏  举报