什么是webservice
Webservice入门程序
Webservice的应用场景
Webservice的三要素
WSDL:web服务描述语言
SOAP:简单对象访问协议
UDDI:目录服务
Webservice的四种客户端调用方式
生成客户端调用方式
客户端编程调用方式
HttpURLConnecton调用方式
Ajax调用方式
深入开发:用注解修改WSDL内容
2 什么是webservice
2.1什么是远程调用技术
远程调用数据定义:是系统和系统之间的调用
2.2 Webservice的原理图
Webservice是使用Http发送SOAP协议的数据的一种远程调用技术
Webservice要开发服务端
Webservice要开发客户端
Webservice客户端开发需要阅读服务端的使用说明书(WSDL)
3 Webservice的入门程序
需求
l 服务端:发布一个天气查询服务,接收客户端城市名,返回天气数据给客户端
l 客户端:发送城市名称给服务端,接收服务端的返回天气数据,打印
实现服务端:
开发步骤:
第一步:创建SEI(Service Endpoint Interface)接口,本质上就是Java接口
public interface WeatherInterface {
public String queryWeather(String cityName);
}
l 第二步:创建SEI实现类,在实现类上加入@WebService
@WebService
public class WeatherInterfaceImpl implements WeatherInterface{
@Override
public String queryWeather(String cityName) {
// TODO Auto-generated method stub
System.out.println("from city...."+cityName);
String weather = "大晴天";
return weather;
}
}
第三步:发布服务,Endpoint发布服务,publish方法,两个参数:1.服务地址;2.服务实现类
public class WeatherService {
public static void main(String[] args) {
// TODO Auto-generated method stub
Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
}
l 第四步:测试服务是否发布成功,通过阅读使用说明书,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功。
Ø WSDL地址:服务地址+”?wsdl”
Ø WSDL阅读方式:从下往上
3.3.2客户端:
开发步骤
第一步:wsimport命令生成客户端代码
wsimport -s . http://127.0.0.1:12345/weather?wsdl
第二步:根据使用说明书,使用客户端代码调用服务端
第一步:创建服务视图,视图是从service标签的name属性获取
第二步:获取服务实现类,实现类从portType的name属性获取
第三步:获取查询方法,从portType的operation标签获取
public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherInterfaceImplService weatherInterfaceImplService = new WeatherInterfaceImplService();
WeatherInterfaceImpl interfaceImpl = weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);
String queryWeather = interfaceImpl.queryWeather("北京+天津");
System.out.println(queryWeather);
}
3.4 Webservice的优缺点
优点:发送方式采用http的post发送,http的默认端口是80,防火墙默认是不拦截。采用XML格式封装数据,是跨平平台的。webservice是支持面向对象。
缺点:采用xml格式封装数据,所以在传输过程中,要传输而外的标签,随着SOAP协议的不断完善,标签越来越大,导致webservice性能下降。
4 Webservice应用场景
4.2适用场景
发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议使用webservice
服务端已经确定使用webservice,客户端不能选择,必须使用webservice
4.3 不适用场景
考虑性能时不建议使用webservice
同构程序下不建议使用webservice,比如java 用RMI,不需要翻译成XML的数据
5 WSDL
定义:
WSDL即web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。
文档结构:
<service>服务视图,webservice的服务节点,它包括了服务端点
<binding>为每个服务端点定义消息格式和协议细节
<portType>服务端点,描述web service可执行的操作方法,以及相关的消息,通过binding指向portType。
<message>定义一个操作(方法)的数据参数(可有多个参数)
<types>定义webservice使用的全部参数类型
6 SOAP
定义
SOAP即简单对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。
SOAP=http+xml
6.2 协议格式
必须有Envelope元素,此元素将整个XML文档标识为一条SOAP消息
可选的Header元素,包含头部信息
必须有Body元素,包含所有的调用和响应信息
可选的Fault元素,提供有关在处理此信息所发生错误的信息
6.3 TCP/IP Monitor
请求
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 214
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>
响应
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:14:29 GMT
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
SOAP1.2
Ø 如果想发布SOAP1.2服务端,需要在服务端引入第三方JAR(jaxws-ri-2.2.8)
Ø 在实现类上加入如下注解
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
请求
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;
action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 212
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>
响应
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:25:24 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
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