什么是WebService?
web Service也叫XML Web Service,Web服务。可使用开放的xml标准来描述、发布、发现、协调和配置这些应用程序。用于开发分布式的互操作的应用程序。
是一种跨编程语言、跨操作系统、跨网络的远程服务器调用技术。
Webservice使用http传输SOAP协议的数据的一种远程调用技术
1.1 什么是远程调用技术
远程调用数据定义:是系统和系统之间的调用.
1.2 WebService的原理图
1. Webservice是使用Http发送SOAP协议的数据的一种远程调用技术
2. Webservice要开发服务端
3. Webservice要开发客户端
4. Webservice客户端开发需要阅读服务端的使用说明书(WSDL)
WebService入门程序
WebService开发规范
- JAX-WS: java api for xml web service
- JAXM:java api from xml message主要定义了包含了发送和接收消息所需的API
- JAX-RS:java api from xml RESTFUL
JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范
以下演示JAX-WS案例:
2.1 需求
- 服务端:发布一个天气查询服务,接收客户端城市名,返回天气数据给客户端
- 客户端:发送城市名称给服务端,接收服务端的返回天气数据,打印
2.2 环境
JDK:1.8
Eclipse:2017
2.3 实现
2.3.1 服务端
开发步骤:
第一步
2.3.2 客户端
注意:
1. 要先发布服务,服务运行的状态下生成代码
2. -s后面有个小点,用于指定源代码生成的目录。点即当前目录。
3. 运行客户端必须开启远程服务
开发步骤:
第一步:
2.3.3 WebService的优缺点
a.优点:
1.发送方式采用http的post发送,http的默认端口事80,防火墙默认不拦截80,所以跨防火墙。
2.采用XML格式封装数据,XML是跨平台的,所以webservice也是跨平台的。
3.webService支持面向对象
b.缺点:
采用XML格式封装数据,所以在传输过程中,要传输额外的标签,随着SOAP协议的不断完善,标签越来越大,导致webservice性能下降
第三章 WebService的应用场景
3.1 软件集成与复用
3.2 适用场景
- 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议使用webservice
- 服务端已经确定使用webservice,客户端不能选择,必须使用webservice
3.3 不适用场景
- 考虑性能时不建议使用webservice
- 同构程序下不建议使用webservice,比如java 用RMI,不需要翻译成XML的数据
第四章 WebService的三要素
4.1 SOAP:简单对象访问协议
4.1.1 定义
SOAP:(Simple Object Access Protocol)简单对象访问协议。是XML Web Service 的通信协议.当用户通过UDDI找到 你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。
SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP.
SOAP=http+xml
4.2.1 协议格式
1. 必须有Envelope元素,此元素将整个XML文档标识为一条SOAP消息
2. 可选的Header元素,包含头部信息
3. 必须有Body元素,包含所有的调用和响应信息
4. 可选的Fault元素,提供有关在处理此消息所发生错误的信息
4.2.2 TCP/IP Monitor
- 代理原理
客户端不直接去访问服务端的内容,而是通过代理服务去访问服务端的内容 - 配置
- 配置显示监控页面: Eclipse菜单栏中Window—Show View—Debug—TCP/IP Monitor
- 配置监控器:Eclipse菜单栏中Window—Preferences— Run/Debug—TCP/IP Monitor—Add
- 测试
在浏览器中输入代理服务地址,能正常访问,代表代理服务器设置成功
4.2.3 SOAP1.1
使用代理服务端口号和地址进行测试
- 请求
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://webservice.sky.com/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn- revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
Host: 127.0.0.1
Connection: keep-alive
Content-Length: 211
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://webservice.sky.com/">
<arg0>北京</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope> - 响应
HTTP/1.1 200 OK
Date: Tue, 31 Oct 2017 07:45:09 GMT
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
e4
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:queryWeatherResponse xmlns:ns2="http://webservice.sky.com/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
0
4.2.4 SOAP1.2
- 发布SOAP1.2服务端,在实现类上加入如下注解:@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
备注: 在某些版本上不支持SOAP1.2服务端发布,直接发布异常。
需要在服务端引入第三方JAR(jaxws-ri-2.2.8jaxws-rilib下所有jar包)
- 请求
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;action="http://webservice.sky.com/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
Host: 127.0.0.1
Connection: keep-alive
Content-Length: 209
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://webservice.sky.com/">
<arg0>北京</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope> - 响应
HTTP/1.1 200 OK
Date: Tue, 31 Oct 2017 08:07:17 GMT
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
e2
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://webservice.sky.com/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
0
4.2.5 SOAP1.1和SOAP1.2区别
相同点:
请求发送方式相同:都是使用POST
协议内容相同:都有Envelope和Body标签
不同点:
数据格式不同:content-type不同
SOAP1.1:text/xml;charset=utf-8
SOAP1.2:application/soap+xml;charset=utf-8
命名空间不同:
SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/
SOAP1.2:http://www.w3.org/2003/05/soap-envelope
4.2 WSDL:Web服务描述语言
4.2.1 定义
WSDL:Web Services Description Language.
是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdl是webservice的使用说明书.大多数情况下由软件自动生成和使用.
一般用于Web Service的发布的服务的说明文档。
4.2.2 文档结构
<service>:服务视图,webservice的服务结点,它包括了服务端点
<binding>:为每个服务端点定义消息格式和协议细节
<portType>:服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType
<message>:定义一个操作(方法)的数据参数(可有多个参数)
<types>:定义 web service 使用的全部数据类型
4.2.3 阅读方式从下往上
4.3 UDDI:目录服务
UDDI:
第五章 WebService客户端调用方式
公网服务地址:
http://www.webxml.com.cn/zh_cn/index.aspx
5.1 生成客户端调用方式
5.1.1 wsimport 命令介绍
1. wsimport就是jdk提供的的一个工具,作用就是根据WSDL地址生成客户端代码.
2. 位置JAVA_HOME/bin目录下
3. wsimport常用的参数:
-s 生成java文件的
-d 生成class文件的,默认参数
-p 指定包名的,如果不加该参数,默认包名就是wsdl文档中的命名空间的倒序
5.1.2 调用公网手机号归属地查询服务
5.1.3 公网天气服务端查询
import
5.1.4 特点
该种方式使用简单,但一些关键的元素在代码生成时写死到生成代码中,不方便维护,所以仅用于测试。
5.2 客户端编程调用方式
package
5.3 HttpURLConnection调用方式
第一步 创建服务地址
第二步 打开一个通向服务地址的连接
第三步 设置参数
设置POST,POST必须大写,如果不大写,报异常
第四步 组织SOAP数据,发送请求
第五步 接收服务端响应,打印
示例:
import
第六章 深入开发:用注解修改WSDL内容
6.1 JAX-WS注解
6.1.1 注解说明
WebService的注解都位于javax
6.1.2 注解示例
package
6.1.3 使用注解注意的地方
@WebMethod对所有非静态的公共方法对外暴露为服务.
对于静态方法或非public方法是不可以使用@WebMethod注解的.
对public方法可以使用@WebMethod(exclude=true)定义为非对外暴露的服务。