WebService浅析
***********************************************声明****************************************************** ? ? ? 原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。 ? ? ? 由于各种原因,可能存在诸多不足,欢迎斧正! *********************************************************************************************************? ? ? ? ?目前工作主要是对接系统商,都是基于OSI五层模型中的最顶层-应用层web服务,屏蔽了下面传输层、网络层、数据链路层、物理层等操作。系统与系统之间通过网络交换数据,无论什么语言,应用层已经被封装成学习成本不高的API,尤其是Java这样一种开源框架较多的高级语言。前后大约对接了10+多家景区或者系统商,接口调用方式大致分为两种:HTTP和Webservice。对于HTTP,原理课本或者网上比较常见,相信都能了解一下,调用具体做法github上引入某种httpclient封装成符合自己业务或技术特点的类库。而对于WebService服务,接触相对较少,而且如果Java开发的话,会引入一大堆类库,如:PortType、Binding、Service等,调用比较简单,如果不清楚原理以及在此基础上写个服务端、中间层、调用端,可能会被绕进去。?? ? ? WebService是基于HTTP协议的采用SOAP原理的web远程服务接口技术。 1、XML ? ? ?Extensible Markup Language,可拓展标记语言,是在web上传输结构化数据的标记语言,语法基于标签,较为简单易学;
? ? ?Simple Object Access Protocol,简单对象访问协议,简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为规范的调用途径,XML作为数据传送的格。它包括四个部分: 2.1)、SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架; 2.2)、SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; 2.3)、SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定; 2.4)、SOAP绑定(binding),使用底层协议交换信息。? ?注:Remote Procedure Call Protocol,远程过程调用协议,一般指网络系统或者分布式系统中调用远程服务的一系列规则或者规范。? ? ?WebService是基于SOAP协议通过HTTP来调用对应RPC的网络服务框架。首先引入WSDL文档(即Web Services Description Language,网络服务描述语言),客户都client可以通过识别WSDL文档来调用WebService,生成一个SOAP请求消息。客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器,解析收到的SOAP请求,调用对应的WebService方法,然后生成相应的SOAP应答,通过HTTP应答的方式把它送回到客户端。 相比直接HTPP访问,WebService的优缺点如下: WebService优点 1、封装度高,数据高度结构化,接口可读性比较强,应用方便; 2、面向对象,开发效率高,适合商业化 WebService缺点 1、引入代码较多,对于初学者难以理解; 2、效率不高,本身HTTP是应用层协议,效率就不高;此外,XML不论是解析还是单元素或属性都要包含两次(<element>128</element>),网络传输上时间和空间损耗都比较大。 ? ? ? ? ?? 关于WebService的客户端与服务端的生成方法,具体见这几篇博客: java 实现WebService 以及不同的调用方式 IntelliJ IDEA 开发 WebService ? ? ? 下面,贴一段 Java WebService Server代码:
package webserviceserverdemo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.Endpoint; /** * @功能: WebService Server * @authord: jin.xu * @version: v1.0.0 * @see: * @date: 2016/1/16 16:10 */ @WebService(serviceName="WebServiceServerDemo") public class WebServiceServerDemo { /**operationName指定操作的方法别名,可以省略,默认是方法名*/ @WebMethod(operationName="welcome") /**指定返回的localPart*/ @WebResult(name="welcomereturn") public String welcome(@WebParam(name="name") String name){ String retValue="Hello WebService : " + name; return retValue; } public String goodbye(String name){ String retValue= "goodbye WebService : " + name; return retValue; } /**exclude=true表明该方法不被发布*/ @WebMethod(exclude=true) public String welcomeExclude(String name){ String retValue= "Hello WebService[exclude] : " + name; return retValue; } public static void main(String[] args) { /** * 参数1:url,指服务的发布地址 * 参数2:wenservice服务类,编写具体的服务逻辑代码 */ Endpoint.publish("http://localhost:9010/xiaofengcanyu.indv.com",new WebServiceServerDemo()); } } ? ? 然后打开浏览器访问"http://localhost:9010/xiaofengcanyu.indv.com?wsdl",就会自动生成WSDL,客户端可以直接通过这个WSDL来生成调用代码片段,惭怍较为简单。
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --> <!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webserviceserverdemo/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://webserviceserverdemo/" name="WebServiceServerDemo"> <types> <xsd:schema> <xsd:import namespace="http://webserviceserverdemo/" schemaLocation="http://localhost:9010/xiaofengcanyu.indv.com?xsd=1"/> </xsd:schema> </types> <message name="goodbye"> <part name="parameters" element="tns:goodbye"/> </message> <message name="goodbyeResponse"> <part name="parameters" element="tns:goodbyeResponse"/> </message> <message name="welcome"> <part name="parameters" element="tns:welcome"/> </message> <message name="welcomeResponse"> <part name="parameters" element="tns:welcomeResponse"/> </message> <portType name="WebServiceServerDemo"> <operation name="goodbye"> <input wsam:Action="http://webserviceserverdemo/WebServiceServerDemo/goodbyeRequest" message="tns:goodbye"/> <output wsam:Action="http://webserviceserverdemo/WebServiceServerDemo/goodbyeResponse" message="tns:goodbyeResponse"/> </operation> <operation name="welcome"> <input wsam:Action="http://webserviceserverdemo/WebServiceServerDemo/welcomeRequest" message="tns:welcome"/> <output wsam:Action="http://webserviceserverdemo/WebServiceServerDemo/welcomeResponse" message="tns:welcomeResponse"/> </operation> </portType> <binding name="WebServiceServerDemoPortBinding" type="tns:WebServiceServerDemo"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="goodbye"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="welcome"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="WebServiceServerDemo"> <port name="WebServiceServerDemoPort" binding="tns:WebServiceServerDemoPortBinding"> <soap:address location="http://localhost:9010/xiaofengcanyu.indv.com"/> </port> </service> </definitions> ? ?客户端client代码较多,在此就不直接贴了,欢迎到我的github个人主页下载: server ? ? 如果有其他发现错误的地方,欢迎斧正! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |