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是什么?是一个远程调用技术。
远程:相对于本地,不是当前应用服务的。
调用:数据交互。
原来的都是单机系统,
特点:数据的存储和调用都是透明的。比如数据库的存储方式、类型等。都是知道的、模块之间的调用也是随意的、透明的。
1.自己想要,但没有
2.自己有数据,别人想要
接口的概念:
以前学过socket技术,就是一种接口技术,它有服务端和客户端,相互传递数据。
我们需要什么样的呢?
我们在本地编写客户端,来调用网络上现成的服务端的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.编写客户端调用程序
客户端代码:
运行结果:
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。
简单的说:WebService即Web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。
Web服务:基于HTTP和XML的技术,HTTP是互联网上应用最为广泛的一种网络协议,而XML是跨平台的基础。 跨编程语言和跨操作平台:就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用:就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率
提示:市面上接口应用的技术很多,不止是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.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就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。
优点(摘自百度百科):
可扩展的。SOAP 无需中断已有的应用程序, SOAP 客户端、 服务器和协议自身都能发展。而且SOAP 能极好地支持中间介质和层次化的体系结构。 简单的。客户端发送一个请求,调用相应的对象, 然后服务器返回结果。这些消息是XML 格式的,并且封装成符合HTTP 协议的消息。因此,它符合任何路由器、 防火墙或代理服务器的要求。 完全和厂商无关。SOAP可以相对于平台、 操作系统、 目标模型和编程语言独立实现。另外,传输和语言绑定以及数据编码的参数选择都是由具体的实现决定的。 与编程语言无关。SOAP 可以使用任何语言来完成,只要客户端发送正确SOAP 请求( 也就是说, 传递一个合适的参数给一个实际的远端服务器)。SOAP 没有对象模型,应用程序可以捆绑在任何对象模型中。 与平台无关。SOAP 可以在任何操作系统中无需改动正常运行。
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:
好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 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
w3c中规定:
注意:规范和实现还是有少许差别的。:java的服务端生成的wsdl和.net生成的会有少许差距。
从下往上阅读
描述Webservice服务的一些信息,名称、地址、提供的服务端点等
描述端口的一些传输协议等
作用:描述Webservice服务的具体服务操作(方法)
描述,请求或响应的数据内容
描述参数的类型、个数等
【了解】
wsimport客户端生成桩是根据wsdl文件生成的。
问题:客户端是从服务端直接拉取下来的代码吗?
不是!!!!!!!客户端根本就不知道服务端的代码怎么写的。
在线解析:
但有时候,需要离线解析。
场景:你开发客户端的时候,不能和服务端网络连接。但程序还要开发,通过分析发现,客户端开发主要有wsdl的文档就可以了。因为有该文档,就可以生成桩(客户端代码)。
因此我们可以将wsdl保存下来,在不能访问服务端的情况下使用。
等开发完成,再将客户端程序拿到能访问到服务端的环境中测试。
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协议,其实不只是ws使用,邮件smtp传输协议也是这个。
代理的基本原理:
eclipse内置的插件代理工具:
配置方法:
启动代理:
使用:直接将客户端调用的端口改成代理服务器的端口:
再次访问,在代理服务器上看传输的消息。
请求报文:
响应:
消息的传递相当于一个信封。
信封头(皮)(报头):地址,收件人。。
信纸:(报文):具体的业务信息内容
完整结构:
更改服务端的soap版本
启动服务,报错:
说明少包,没法生成soap1。2协议的wsdl。
该包支持soap1。2的服务。
将lib中的jar全部导入到工程中,引入类路径。
请求消息:
响应的:
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来演示。
反过来说:只要使用了注解,那么服务端的代码怎么改其实都对wsdl或客户端没有影响。
好处:屏蔽了服务端的代码的具体内容。
【推荐工具】
文件比较工具。
Webservice的sei的方法的要求:
1.新建项目:
2.服务端:
编写步骤:
sei(接口和实现类)实现类:
加注解
提示:1。2的协议需要导入扩展包
发布
测试:
访问wsdl:
看版本:
1。1
1。2
复杂返回对象
1)使用wsimport命令生成桩
添加参数支持1。2的桩的生成:
将其拷贝到工程中
2)编写客户端代码
小结:ws支持简单的对象传输(通常是字符串),也支持复杂对象的传输,甚至mp3音乐、图片。
【课后扩展选作】
提示:
会文件流的操作,就可以做这个功能。
通常,实际业务开发过程中,为了保证ws真正跨平台、跨语言,一般传递字符串。一般该字符串,使用xml或者json表示。无论复杂,还是简单的数据,都可以用其表示!
这样设计之后,工作量会转换到组装和解析xml和json上面了,可能有大量的业务逻辑。
列表:
"[{},{},{},{}]"
现在企业对接口开发的思想:简化接口的开发难度,难度转移到业务上(解析和封装json上了)
服务端的使用
作用:发布一个服务,给别人用—提供数据(l类似于数据库了)
代码一般写在业务层service层(因为1。代码中逻辑需要事务控制 2。调用dao—查询数据)
服务端没有表现层。
客户端的使用
作用:调用服务端,获取服务端的数据---认为服务端是个数据库。(crud)
代码放:dao数据持久层。你就把webservice当成一个数据库来使用就行了。
问题:服务端开发完成后如何验证其正确呢?
解决方案
1:写一个客户端。(该客户端并不是为了满足业务需求的,浪费)
2:使用专业的测试工具soapui
免费版本(5.x)+收费版本(3.x)
安装后:
介绍:
【提示环境】
需要jdk的配置。
新建一个测试项目
填写wsdl的测试地址:
业务测试方式:
响应:
因为Webservice,提供业务服务,该服务容量(能同时并发多少请求)、稳定性。
步骤:
1.构建一个测试用例:模拟一个具体业务,比如我们在用例中输入业务数据,此时,该用例就成为测试用例。
2.根据测试用例,建立压力测试用例
如果过多,说明网络或者该ws服务不稳定。找原因?
网络不稳定 服务器的问题
扩展::
可以体会使用web(三层架构)来调用web
扩展:webxml.com.cn—》获取mp3复杂数据类型的方式(坑—解析wsdl时会发生-不同的平台wsdl有点差别,java不认。)
必须掌握:
文件---》流:FileInputStream(new File(url))
流---》文件:弄一个输出流(newFile(url)),将输入流写入输出流
转载于:https://www.cnblogs.com/beyondcj/p/6271106.html
相关资源:数据结构—成绩单生成器