WebService第一天
WebService第一天
【课程安排】:
整体安排:2天:
第一天:webservice入门,JDK规范和实现:jax-ws,相关概念
第二天:CXF框架,和spring的集成开发。Hessian的开发。
今日安排:(jax-ws)
-
为什么要用ws?
-
第一个ws应用(联网,在网上连接已经提供的服务,来获取数据。)
-
Ws概述(概念、三要素wsdl.soap.uddi)
-
Jax-ws(sun规范,开发服务端和客户端)
-
Ws深入探讨(理解、应用场景)--阅读
-
WSDL详解(规范)
-
SOAP详解(规范)
-
WebService注解
-
复杂类型的支持+回顾
-
调试工具SOAPUI
【学习目标】:
-
理解远程调用的思想
-
学会JAX-WS的服务端和客户端的开发(接口的开发和调用)
-
调试工具的使用。
-
为什么要用Webservice
Webservice是什么?是一个远程调用技术。
远程:相对于本地,不是当前应用服务的。
调用:数据交互。
-
原来的数据传输处理方式
原来的都是单机系统,
特点:数据的存储和调用都是透明的。比如数据库的存储方式、类型等。都是知道的、模块之间的调用也是随意的、透明的。
-
业务需求的问题
1.自己想要,但没有
2.自己有数据,别人想要
-
如何解决上述问题
-
开放数据库权限?(在一个机房,是一个单位的不同系统)
-
U盘拷贝?(高考业务,每年只查询一次,教育局才有)
-
自己收集数据?
-
……
-
我们的需求
-
可以通过接口的技术来获取数据。
接口的概念:
-
需要什么接口呢?
以前学过socket技术,就是一种接口技术,它有服务端和客户端,相互传递数据。
我们需要什么样的呢?
-
第一个Webservice应用
-
业务需求
-
我们在本地编写客户端,来调用网络上现成的服务端的ws,获取手机号归属地的信息。
http://www.jisuapi.com/api/
我们用:http://www.webxml.com.cn/
-
编写客户端调用远程的手机号归属地信息
1.创建一个java工程
ws_day1_firstclient
2,。根据Webservice的wsdl地址生成客户端代码
wsdl就是个xml,我们看不懂,让程序看,让程序生成java代码就可以了。
打开cmd窗口,输入命令:
会自动生成java文件,将class删掉。
【提示】
如果生成的代码提示错误:
原因:jdk的原因。
jdk6和jdk7对ws的客户端的代码支持的不太一样。
解决方案:
1)如果工程一定要用1。6,则需要手动修改生成的代码,将方法的参数删掉一个:
2)就将工程的jdk版本变成1。7
3.编写客户端调用程序
客户端代码:
运行结果:
-
Webservice概述
-
什么是Webservice
-
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。 |
简单的说:WebService即Web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。
|
提示:市面上接口应用的技术很多,不止是webservice。
web Service:有两大类:
一类:传统的webservice,大web service,相对复杂。
一类:轻量级的webservice
-
前世今生
-
三要素(面试)
WebService的三要素是:
-
SOAP (Simple Object Access Protocol):简易对象访问协议,soap用来描述传递信息的格式。
-
WSDL (WebServices Description Language):Web服务描述语言,用来描述如何访问具体的接口。
-
UDDI (Universal Description Discovery and Integration):通用描述、发现及整合,用来管理、分发、查询webService。
UDDI:
弱化uddi,原因:现在的接口交互,一般服务方和调用方直接商量。 |
-
Jax-WS的快速入门
-
Jax-WS是什么
-
解读说明书
白皮书:《JAX-WS.pdf.pdf》
-
服务端的开发
1.先编写sei(接口和实现类)
接口
实现类:
2.加注解
最基本的注解,在实现类上加@Webservice,该类就变成Webservice的服务类了。
3.发布服务
api:
测试一下是否发布成功:
方法就是通过访问ws的说明书wsdl,看是否能显示。
访问的格式:Webservice地址+?wsdl
【扩展】
如何在Windows下查看端口占用情况:
-
客户端的开发
1.建立一个客户端的工程
2.通过wsimport命令+wsdl文档,获取客户端java程序(stub桩,本地代理接口类实例)
wsimport是jdk自带的命令。
在cmd中输入命令和参数:
将生成的代码(桩 )直接拷贝到工程中
3.编写客户端调用代码:
缺点:代码过度耦合生成的代码。代码不灵活。
-
客户端的开发-优化
问题:客户端的代码耦合到生成的代码中了(比如访问的服务端地址等,不便于移植)
通过分析Servcie类不能new:
新建一个客户端:
客户端代码:
-
WebService技术深入探讨
-
理解WebService
-
可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。 |
-
优点
优点(摘自百度百科):
|
-
应用场景
WebService是一门新兴和有前途的技术,企业中应用越来越广泛。
建议使用:
不建议使用:
大家可以看一下课前资料:
-
平台技术构成
XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
XML+XSD是WebService的数据传输的基础(了解即可):
WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。 |
下面分别详细说一下WSDL和SOAP的概念和内容:
-
WSDL说明书详解
-
什么是WSDL
-
WSDL:
好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。
WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。
WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。 |
Wsdl大家经常称之为webservice的说明书。
注意:
wsdl的地址:http://127.0.0.1:8888/mobile?wsdl
Webservice地址:http://127.0.0.1:8888/mobile
-
wsdl的基本结构
w3c中规定:
注意:规范和实现还是有少许差别的。:java的服务端生成的wsdl和.net生成的会有少许差距。
-
wsdl的阅读(看懂即可)
从下往上阅读
-
Service服务视图
描述Webservice服务的一些信息,名称、地址、提供的服务端点等
-
Binding:绑定
描述端口的一些传输协议等
-
PortType:端口类型
作用:描述Webservice服务的具体服务操作(方法)
-
message:消息
描述,请求或响应的数据内容
-
type:数据类型
描述参数的类型、个数等
【了解】
wsimport客户端生成桩是根据wsdl文件生成的。
问题:客户端是从服务端直接拉取下来的代码吗?
不是!!!!!!!客户端根本就不知道服务端的代码怎么写的。
-
离线wsdl
在线解析:
但有时候,需要离线解析。
场景:你开发客户端的时候,不能和服务端网络连接。但程序还要开发,通过分析发现,客户端开发主要有wsdl的文档就可以了。因为有该文档,就可以生成桩(客户端代码)。
因此我们可以将wsdl保存下来,在不能访问服务端的情况下使用。
等开发完成,再将客户端程序拿到能访问到服务端的环境中测试。
-
SOAP协议详解
-
什么是soap(能看的懂)
SOAP,Simple Object Access Protocol,简单对象访问协议,简单的说就是用于访问网络服务的协议;它是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
SOAP是一种网络通信协议,用于网络上、不同平台、不同语言的应用程序间的通讯。 WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。 SOAP协议 = HTTP协议 + XML数据格式。 SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。 SOAP很就简单并可扩展支持面向对象,允许跨防火墙。 SOAP被作为 W3C 标准来发展。 SOAP现行两个版本:1.1和1.2。 |
更多信息可以参考W3C文档:
http://www.w3school.com.cn/soap/soap_intro.asp
-
SOAP、Http、TCP/IP之间的关系—了解
打个比方:
SOAP协议,其实不只是ws使用,邮件smtp传输协议也是这个。
-
代理工具TCP/IP Monitor
代理的基本原理:
eclipse内置的插件代理工具:
配置方法:
启动代理:
-
SOAP1.1协议分析
使用:直接将客户端调用的端口改成代理服务器的端口:
再次访问,在代理服务器上看传输的消息。
请求报文:
响应:
-
SOAP消息的标准格式
消息的传递相当于一个信封。
信封头(皮)(报头):地址,收件人。。
信纸:(报文):具体的业务信息内容
完整结构:
-
SOAP1.2协议分析
更改服务端的soap版本
启动服务,报错:
说明少包,没法生成soap1。2协议的wsdl。
该包支持soap1。2的服务。
将lib中的jar全部导入到工程中,引入类路径。
请求消息:
响应的:
-
SOAP1.1和SOAP1.2协议的异同
SOAP1.1和1.2版本之间的大部分差异通常也是可以忽略的
SOAP1.1只可以绑定到HTTP协议,而SOAP1.2除了HTTP协议之外还支持SMTP绑定。在JAX-WS中,类似于大多数框架,SOAP1.1作为默认实现,尽管如此在JAX-WS中可以随时采用SOAP1.2。
-
不同版本协议的调用关系
应用的价值:
-
尽量使用同版本的来相互调用,原因,兼容性好,性能高。
-
如果服务端使用1。1,那么客户端只能使用1。1,但服务端使用1。2,那么客户端可以使用1。1或1。2。,优先用1。2。但国内,很多客户端的开发为了适应不同版本的服务端,会用1。1来开发。
jax-ws客户端会自动适应服务端的版本,无法演示。明天用cxf来演示。
-
Webservice注解(重要)
-
为什么要用注解
-
反过来说:只要使用了注解,那么服务端的代码怎么改其实都对wsdl或客户端没有影响。
好处:屏蔽了服务端的代码的具体内容。
-
常见ws注解的分类和使用
-
类上面的注解
-
-
方法上面的注解
【推荐工具】
文件比较工具。
-
Webservice的方法的编写要求和方法隐藏
Webservice的sei的方法的要求:
-
复杂数据类型的支持+JaxWS回顾小结
-
诉求(需求)
-
-
服务端
1.新建项目:
2.服务端:
编写步骤:
-
sei(接口和实现类)
实现类:
-
加注解
提示:1。2的协议需要导入扩展包
-
发布
测试:
访问wsdl:
看版本:
1。1
1。2
复杂返回对象
-
客户端
1)使用wsimport命令生成桩
添加参数支持1。2的桩的生成:
将其拷贝到工程中
2)编写客户端代码
小结:ws支持简单的对象传输(通常是字符串),也支持复杂对象的传输,甚至mp3音乐、图片。
【课后扩展选作】
提示:
会文件流的操作,就可以做这个功能。
-
关于Webservice的传输数据方式
通常,实际业务开发过程中,为了保证ws真正跨平台、跨语言,一般传递字符串。一般该字符串,使用xml或者json表示。无论复杂,还是简单的数据,都可以用其表示!
这样设计之后,工作量会转换到组装和解析xml和json上面了,可能有大量的业务逻辑。
列表:
"[{},{},{},{}]"
现在企业对接口开发的思想:简化接口的开发难度,难度转移到业务上(解析和封装json上了)
-
开发角度上的使用
服务端的使用
作用:发布一个服务,给别人用—提供数据(l类似于数据库了)
代码一般写在业务层service层(因为1。代码中逻辑需要事务控制 2。调用dao—查询数据)
服务端没有表现层。
客户端的使用
作用:调用服务端,获取服务端的数据---认为服务端是个数据库。(crud)
代码放:dao数据持久层。你就把webservice当成一个数据库来使用就行了。
-
SOAPUI调试工具的使用
问题:服务端开发完成后如何验证其正确呢?
解决方案
1:写一个客户端。(该客户端并不是为了满足业务需求的,浪费)
2:使用专业的测试工具soapui
-
下载安装
免费版本(5.x)+收费版本(3.x)
安装后:
介绍:
【提示环境】
需要jdk的配置。
-
业务测试
新建一个测试项目
填写wsdl的测试地址:
业务测试方式:
响应:
-
性能(压力、负载)测试
因为Webservice,提供业务服务,该服务容量(能同时并发多少请求)、稳定性。
步骤:
1.构建一个测试用例:模拟一个具体业务,比如我们在用例中输入业务数据,此时,该用例就成为测试用例。
2.根据测试用例,建立压力测试用例
如果过多,说明网络或者该ws服务不稳定。找原因?
-
网络不稳定
-
服务器的问题
-
重点和小结
-
为什么要用ws?(为什么要用接口业务)
-
Jax-ws:服务端的开发和客户端的开发(会写就行,企业中更多用框架开发)
-
Webservice相关概念(三要素、理解、优点—跨平台基于xml、应用场景-课后文档)
-
Wsdl和soap详解(看的懂),代理工具。
-
Webservice的注解(规范wsdl文档,影响客户端代码)
-
支持复杂数据类型(但一般不建议使用复杂类型,不容易跨平台,就传字符串:json或xml)-完整示例
-
Soapui的使用(业务测试,压力测试)
扩展::
可以体会使用web(三层架构)来调用web
扩展:webxml.com.cn—》获取mp3复杂数据类型的方式(坑—解析wsdl时会发生-不同的平台wsdl有点差别,java不认。)
必须掌握:
文件---》流:FileInputStream(new File(url))
流---》文件:弄一个输出流(newFile(url)),将输入流写入输出流