前言:
最近在看WebService的视频,觉得视频中的笔记做得很好,便整理了下。
1.1 WebService的作用:
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。
我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S 程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下别人服务器上的一段代码而已。
学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。
WebService可以实现跨平台远程调用,从而实现异构程序之间的通信,特定需求下可以实现远程数据共享、软件重用、分布式程序集成。WebService 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
它采用标准SOAP协议(Simple Object Access Protocol) ,协议传输WebService数据,是w3c标准。
xml和XSD(XML Schema Datatypes)是webservice的基础,是w3c标准,采用wsdl作为描述语言即WebService使用说明书。
WebService的优缺点:
优点:
- 采用xml支持跨平台远程调用。
- 基于http的soap协议,可跨越防火墙。
- 支持面向对象开发。
- 有利于软件和数据重用,实现松耦合。
缺点:
随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率不高,对接口要求不严格的情况下直接用http传输自定义数据内容更快捷,例如第三方支付公司的支持接口。
1.2:WebService的原理(socket)
使用socket实现远程调用
客户端和服务端的调用
1.3:jdk发布WebService服务
使用JAX-WS开发WebService
JAX-WS 的全称为 Java API for XML-Based Webservices,从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本,本教程我们使用jdk1.7.0_07开发。
那么如何才可以发布一个WebService呢?
- 用Jdk1.6.0_13以后的版本发布一个WebService服务,并通过地址栏查看它的wsdl文档。
- 通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是重点)。
- 从互联网上获取一个WebService网络公开的服务,并使用工具生成客户端,调用并查看结果。
1.3.1 服务端开发:
第1步
编写SEI(Service Endpoint Interface),SEI在WebService中称为port,在java中称为接口,接口类型叫portType。
package cn.tiakon.webservice.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface WeatherIntface {
@WebMethod
String queryWeather(String cityName);
}
编写实现类
package cn.tiakon.webservice.service;
import javax.jws.WebService;
@WebService
public class WeatherIntfaceImpl implements WeatherIntface {
@Override
public String queryWeather(String cityName) {
System.out.println("form wsimport..." + cityName);
return "晴天";
}
}
并发布:
package cn.tiakon.webservice.service;
import javax.xml.ws.Endpoint;
public class Service {
public static void main(String[] args) {
//发布地址、受理对象
Endpoint.publish("http://127.0.0.1:12345/WebService/weather", new WeatherIntfaceImpl());
System.out.println("发布webservice...");
//wsimport -s . http://127.0.0.1:12345/WebService/weather?wsdl
//在wsimport文件夹编译文件
}
}
第2步
通过wsimport生成客户端代码
Wsimport介绍
wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码,生成的类文件理解成socket调用骨架。服务器端用什么写的并不重要.客户端调用生成的类从而实现发送soap数据。
wsimport.exe位于JAVA_HOME\bin目录下.
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl
注意:-s不能分开,-s后面有个小点
也可以使用idea快速生成客户端代码
注意: url选择当前服务发布的地址!
第3步
编写客户端,调用服务方法
package cn.tiakon.webservice.client;
import cn.tiakon.webservice.wsimport.WeatherIntfaceImpl;
import cn.tiakon.webservice.wsimport.WeatherIntfaceImplService;
public class Client {
public static void main(String[] args) {
//创建webservice的服务视图
WeatherIntfaceImplService weatherIntfaceImplService = new WeatherIntfaceImplService();
//通过视图得到端点
WeatherIntfaceImpl weatherIntfaceImplPort = weatherIntfaceImplService.getWeatherIntfaceImplPort();
//可以通过服务端点调用webservice接口
//向服务端发送数据北京
String queryWeather = weatherIntfaceImplPort.queryWeather("北京");
System.out.println("from service ..." + queryWeather);
}
}
1.3.2 学会看懂使用说明书(wsdl)
<?xml version="1.0" encoding="UTF-8"?><!-- 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://service.webservice.tiakon.cn/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://service.webservice.tiakon.cn/" name="WeatherIntfaceImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://service.webservice.tiakon.cn/"
schemaLocation="http://127.0.0.1:12345/WebService/weather?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="queryWeather">
<part name="parameters" element="tns:queryWeather"></part>
</message>
<message name="queryWeatherResponse">
<part name="parameters" element="tns:queryWeatherResponse"></part>
</message>
<portType name="WeatherIntfaceImpl">
<operation name="queryWeather">
<input wsam:Action="http://service.webservice.tiakon.cn/WeatherIntfaceImpl/queryWeatherRequest"
message="tns:queryWeather"></input>
<output wsam:Action="http://service.webservice.tiakon.cn/WeatherIntfaceImpl/queryWeatherResponse"
message="tns:queryWeatherResponse"></output>
</operation>
</portType>
<binding name="WeatherIntfaceImplPortBinding" type="tns:WeatherIntfaceImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="queryWeather">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="WeatherIntfaceImplService">
<port name="WeatherIntfaceImplPort" binding="tns:WeatherIntfaceImplPortBinding">
<soap:address location="http://127.0.0.1:12345/WebService/weather"></soap:address>
</port>
</service>
</definitions>
这里从下向上看name的值:
- WeatherIntfaceImplService为视图服务。
- WeatherIntfaceImplPortBinding为调用的端口。
- WeatherIntfaceImpl为接口,接口中提供一个queryWeather()的方法,和一个queryWeatherResponse()方法。
先介绍这么多别的后面再讲
1.4 客户端开发:
package cn.tiakon.webservice.client;
import cn.tiakon.webservice.wsimport.WeatherIntfaceImpl;
import cn.tiakon.webservice.wsimport.WeatherIntfaceImplService;
public class Client {
public static void main(String[] args) {
//创建webservice的服务视图
WeatherIntfaceImplService weatherIntfaceImplService = new WeatherIntfaceImplService();
//通过视图得到端点
WeatherIntfaceImpl weatherIntfaceImplPort = weatherIntfaceImplService.getWeatherIntfaceImplPort();
//可以通过服务端点调用webservice接口中的方法
//向服务端发送数据北京
String queryWeather = weatherIntfaceImplPort.queryWeather("北京");
System.out.println("from service ..." + queryWeather);
}
}
WeatherIntfaceImplService为service、weatherIntfaceImplPort为端口类型(portType)、queryWeather()为调用的方法。
这些参数在wsdl的使用说明书中都会看到。
1.5 什么是WebService?
- Web service 即web服务,因为互联网而产生,发布web服务后可以将资源进行共享,通过webservice调用获取并操作资源信息。
- webservice是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
- 采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属w3c标准。
- 基于http传输xml,即soap=http+xml
- 采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
- xml和XSD(XML Schema Datatypes)是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XSD定义了一套标准的数据类型,数据类型用xml进行描述。
1.6 WebService三要素
SOAP
SOAP即简单对象访问协议(Simple Object Access Protocal)是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单理解为soap=http+xml。
Soap协议版本主要使用soap1.1、soap1.2
SOAP可以运行在任何其他应用协议上。例如,SMTP、tr069等。
WSDL
WSDL 是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdl是webservice的使用说明书。
UDDI
UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
但是使用webservice并不是必须使用UDDI,因为很多时候使用者已经知道了 Web service地址并进行调用。
webService应用场景
1.应用程序集成
分布式程序之间进行集成使用webservice直接调用服务层方法,不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。
2.软件重用
将一个软件的功能以webservice方式暴露出来,达到软件重用。例如上边分析的天气预报,将天气查询功能以webservice接口方式暴露出来非常容易集成在其它系统中;再比如一个第三方物流系统将快递查询、快递登记暴露出来,从而集成在电子商务系统中。
3.跨防火墙通信
如果一个大型系统是基于web的且用户分布在世界各地,除了以浏览器访问系统页面外,如果使用其它客户端访问服务器的功能,客户端和服务器通信问题是大的问题,因为客户端和服务器之间通常会有防火墙或者代理服务器,这时如果使用webservice开发功能就可以很容易跨越防火墙,因为webservice和网页程序都是运行在web容器且用相同的端口和协议。
建议不用webservice
1.单机程序间通信
这里说的单机程序是指一个厂家开发的多个应用部署在一台服务器,当程序之间需要通信且无需将接口暴露给第三方系统时完全没有必要使用webservice技术,这时企业自定义一种简单的接口协议即可,简单高效。
2.同构程序间通信
同构程序是指采用相同的编程语言的程序之间通信,比如java远程调用RMi技术就可以非常高效的实现远程调用,使用简单方便,必需保证两边应用都是java编写才可使用。
总之,只要有其它方法比webservice更高效更可行就不要用webservice,因为web跨平台远程调用方法不止webservice一种,需要择优考虑。
建议使用webservice
1.公开接口
面向互联网公开的接口,例如:某公司产品促销介绍、股票信息查询等,因为webservice是互联网的一个标准协议,将接口发布为webservice,其它公司很容易使用。
2.调用webservice服务端
你作为客户端要调用别人的接口,对方接口用的是webservice,这时你也用webservice开发客户端,且协议版本要和服务端保持一致。
Webservice优缺点
优点:
- 采用xml支持跨平台远程调用。
- 基于http的soap协议,可跨越防火墙。
- 支持面向对象开发。
- 有利于软件和数据重用,实现松耦合。
缺点:
- 由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率更加不高。
- webservice作为web跨平台访问的标准技术,很多公司都限定要求使用webservice,其实对于简单的接口如果直接用http传输自定义数据内容比webservice开发更快捷,例如第三方支付公司的支持接口。
现状前景
就目前来看Webservice主要是作为一种远程调用技术而存在,而远程调用的技术非常多,比webservice简单方便的也有,比如http。但是随是SOA的兴起,面向服务构建应用的模式被推崇,随着webservice标准的规范,相信Web服务将是未来应用架构的一个极为重要的模式,随着Web服务的深入人心,会有越来越多的应用采用Web服务架构开发,Web服务的需求将不断增加。
像一些互联网开发商yahoo、eBay及亚马逊等,都提供了自己的Web服务,大大推动了企业B2B的进程。将来会有更多企业开放自己的Web服务,从中获得更多的效益,这一切都由web服务所带来的,当然web服务正在发展肯定还有更精彩的前景等待人们去开发。