PHP webservice的使用

提到php的webservice。之前还是比较陌生的,因为接触的少呀,几乎在所有的公司中没用过,仅仅用过的一次好像是接入一个第三方的短信通道,用的是SOAP|WSDL。

一个很极端的话“webservice”已经过时了一点不假:

1 WebService有很多协议,为什么HTTP比较流行?

WebService是个很重型的规范,它的应用协议是SOAP(简单对象访问协议),它所依赖的下层通信方式不单单是HTTP,也有SOAP over SMTP, SOAP over TCP,由于HTTP协议群众基础广,开发调试方便,所以,成了WebService中最为流行的方式。

甚至很多公司在内网通信,也用HTTP来做,比如,应用调用搜索引擎,Solr就是一个例子。

但HTTP也是TCP上性能比较差的协议,因为HTTP是基于TCP的,有3次握手,再加上HTTP是个文本传输协议(虽然也可以传二进制的附件,但业务逻辑还是文本用的多),又有很多复杂的HEADER。所以人们发明了一些更高效的通信协议来做远程调用,比如ACE、ICE、Corba、淘宝的HSF,但这是后话了,不展开细说。你只要知道,HTTP之所以流行,乃是简单易用群众基础广的结果。

2 WebService为什么不如RESTful API流行

WebService诞生十几年了,最初是IBM、微软比较热心在推,一直也不温不火。倒是XML-RPC, RESTful以及比RESTful还要简陋的远程调用方式后来居上。感觉是不是有点像民间的Spring干掉官方的EJB?

究其原因,还是WebService实在太笨重了,SOAP信封犹如婆娘的裹脚布,又臭又长,广大开发人员是叔可忍嫂不能忍,于是就有了简化版的,叫XML-RPC,后来伴随着Web2.0流行,RESTful独领风骚。我在10年前做过一个产品,纯PHP+JS,标准的WebService,连WSDL我都要专门写个PHP程序来生成,还好只是我一个人开发,要是团队协作,我早就被骂得不成人形了。

再后来,连RESTful都被嫌弃了,大伙儿干脆连PUT、DELETE都懒得用,直接用GET和POST。

同时,我得说,这只是在互联网领域,大部分企业的业务逻辑相对简单,同时工期又变态的短(就像大部分互联网创业公司用糙快猛的PHP,而不用相对严谨的Java一样)。在某些业务复杂,稳定性和正确性要求高的领域(如ERP、电商、支付),WebService还有是用武之地的。

3 为什么JSON比XML流行

还是易用性,JSON的可读性比XML强几条长安街,解析规则也简单许多。XML解析的时候规则太多了,动不动就非法字符,动不动就抛异常。这对追求高开发速度和低开发门槛的企业来说,是个致命伤。

JSON的缺点是数据类型支持较少,且不精确。比方说:

price:12580

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

所以,如上面第二条所述,在一些业务要求较高的领域,还是XML更合适。

最后说一下性能,JSON的性能高于XML,除此之外,基于XML和HTTP的WebService, 基于JSON的RESTful API,并没有性能差异。

XML性能糟糕到什么地步呢,有一种专门的CPU叫做XML Accelerator,专门为XML解析提供硬件加速。

 

来源:https://segmentfault.com/q/1010000000643367

 

既然title是webservice,我们就说下webservice的实现。这里先说说SOAP与WSDL

SOAP

  • 中文名称

    简单对象访问协议

  • 外文名称

    Simple Object Access Protocol

  • 外国语缩写

     SOAP

   SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration)之一, soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService 。具体实现可以搜索 Web Services简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象

  SOAP采用了已经广泛使用的两个协议:HTTP 和XML(标准通用标记语言下的一个子集)。HTTP用于实现 SOAP 的RPC 风格的传输, 而XML 是它的编码模式。采用几行代码和一个XML 解析器, HTTP 服务器( MS 的 IIS 或 Apache) 立刻成为SOAP 的 ORBS。SOAP 通讯协议使用 HTTP 来发送XML 格式的信息。HTTP与RPC 的协议很相似,它简单、 配置广泛,并且对防火墙比其它协议更容易发挥作用。HTTP 请求一般由 Web 服务器软件(如 IIS 和Apache)来处理, 但越来越多的应用服务器产品正在支持HTTP。XML 作为一个更好的网络数据表达方式( NDR)。SOAP 把 XML 的使用代码化为请求和响应参数编码模式, 并用HTTP 作传输。具体地讲, 一个SOAP 方法可以简单地看作遵循SOAP编码规则的HTTP请求和响应, 一个 SOAP终端则可以看作一个基于HTTP 的URL, 它用来识别方法调用的目标。像CORBA/ IIOP一样, SOAP不需要具体的对象绑定到一个给定的终端, 而是由具体实现程序来决定怎样把对象终端标识符映像到服务器端的对象。

来源:http://baike.so.com/doc/1194278-1263211.html

WSDL

  • 中文名称

    网络服务描述语言

  • 外文名称

    Web Services Description Language

  • 外语缩写

    WSDL

    WSDL是Web Service的描述语言,是一种接口定义语言,用于描述Web Service的接口信息等。在 2001 年 3 月,WSDL 1.1 被 IBM、微软作为一个W3C纪录(W3C note)提交到有关XML协议的 W3C XML 活动,用于描述网络服务。(W3C 纪录仅供讨论。一项 W3C 纪录的发布并不代表它已被 W3C 或 W3C 团队亦或任何 W3C 成员认可。)在 2002 年 7 月,W3C 发布了第一个 WSDL 1.2 工作草案

    怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。

来源:http://baike.so.com/doc/1062930-1124475.html

 

 

 

Web Service一般用.net或Java开发,客户端任何语言都能调用。这里我们说说php的Web Service服务端。

关于使用WSDL模式参考http://blog.csdn.net/rrr4578/article/details/24451943http://www.open-open.com/lib/view/open1324368162639.html   有WSDL文件生成工具。

这里我们仅演示Web Service服务端客户端调用的过程,不试用WSDL,使用参数模式的non-wsdl

 

首先PHP.ini 要开启soap模块,否则报错:

Fatal error: Uncaught Error: Class 'SoapClient' not found in F:\web\test\webclient.php:5 Stack trace: #0 {main}

 

服务端

 soapserverd.php

class soapserverd
{ 
    
    public  function Addr($a,$b) {    
       return $a + $b;
    }
}

$server=new SoapServer(NULL,['uri'=>'ssredd','soap_version' => SOAP_1_2]);

//装载soapserverd
$server->setClass("soapserverd");
$server->handle();

 

客户端

<?php


$s = new SoapClient(Null,['uri'=>'ssredd','location'=>'http://m.web.com:81/soapserverd.php']);  //non-wsdl模式

# 调用
$suc = $s->addr(25,31);      //方法1
$result =$s-> __soapCall('addr',array(80,9));  //方法2
echo "<pre>";
echo $suc."<br/>";
echo $result;
echo "</pre>";

 

说明:

1. uri 服务端的和客户端的值必须保持一致

2. 在本地测试时,不能使用一个端口(导致无响应)

3. 使用__soapCall方法调取webservice中的方法的时候,要加上引号“”,否则:

Notice: Use of undefined constant addr - assumed 'addr' in……

打印结果:

转载于:https://www.cnblogs.com/dcb3688/p/4608034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值