Web service是什么
1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
2. 一个跨语言、跨平台的规范(抽象)
3. 多个跨平台、跨语言的应用间通信整合的方案(实际)
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).
网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已
为什么要用Web service?
web service能解决:
跨平台调用
跨语言调用
远程调用
什么时候使用web Service?
1. 同一家公司的新旧应用之间
2. 不同公司的应用之间
分析业务需求:天猫网与中通物流系统如何交互?
3. 一些提供数据的内容聚合应用:天气预报、股票行情
Web Service中的几个重要术语
WSDL:web service definition language
xml
uml
直译 : WebService定义语言 1. 对应一种类型的文件.wsdl 2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式 3. 一个web service对应一个唯一的wsdl文档 |
SOAP:simple object access protocal
直译: 简单对象访问协议 1. 是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据 2. soap消息:请求消息和响应消息 3. http+xml片断 |
SEI:WebService EndPoint Interface(终端)
直译: web service的终端接口,
1. 就是WebService服务器端用来处理请求的接口 @Webservice @WebMethod |
CXF:Celtix + XFire
一个apache的用于开发webservice服务器端和客户端的框架 |
面试问题
1. webservice相当于HTTP+?+?
? : xml
? : schema
2. wsdl是什么?
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
3. 如何发布一个webservice?
定义SEI @webservice @webMethod
定义SEI的实现
发布: Endpoint.publish(url, SEIImplObject)
4. 如何请求一个webservice?
1. 根据wsdl文档生成客户端代码 jdk/cxf
2. 根据生成的代码调用webService
开发webservice
开发手段:
使用JDK开发(1.6及以上版本)
使用CXF框架开发(工作中)
组成:
服务器端
客户端
使用JDK开发WebService
1).开发服务器端
• Web Service编码:
– @WebService( SEI和SEI的实现类)
– @WebMethod(SEI中的所有方法)
• 发布Web Service:
– Endpoint(终端,发布webservice)
新建一个项目
HelloWS接口
package com.me.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
/*
* SEI
*/
@WebService
public interface HelloWS {
@WebMethod
public String sayHello(String name);
}
HelloWSImpl实现类
package com.me.ws;
import javax.jws.WebService;
/*
* SEI的实现
*/
@WebService
public class HelloWSImpl implements HelloWS {
@Override
public String sayHello(String name) {
System.out.println("server sayHello()" + name);
return "Hello " + name;
}
}
发布Web Service
package com.me.ws.server;
import javax.xml.ws.Endpoint;
import com.me.ws.HelloWSImpl;
/*
* 发布Web Service
*/
public class ServerTest {
public static void main(String[] args) {
String address = "http://192.168.1.101:8989/hellows";
Endpoint.publish(address, new HelloWSImpl());
System.out.println("发布webservice成功!");
}
}
通过浏览器访问
http://192.168.1.101:8989/hellows?wsdl
使用eclipse工具调用
2). 开发客户端
创建客户端应用编码方式访问
– 借助jdk的wsimort.exe工具生成客户端代码:
wsimport -keep url //url为wsdl文件的路径
新建客户端项目
借助jdk的wsimort.exe工具生成客户端代码
刷新客户端项目会看到客户端代码
借助生成的代码编写请求代码
package com.me.ws.client;
import com.me.ws.HelloWSImpl;
import com.me.ws.HelloWSImplService;
public class Client {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWSImpl helloWS = factory.getHelloWSImplPort();
System.out.println(helloWS.getClass());
String result = helloWS.sayHello("marry");
System.out.println("client "+result);
}
}
请求结果
监听请求: 使用Eclipse的TCP/IP工具(端口转发)
1.将服务器端的WSDL文档保存到客户端本地
2.修改文档: 将端口号从8989改为8080
3.根据本地的wsdl文档生成客户端代码, 并编写客户端的调用代码
4.配置eclipse的TCP/IP,启动监听
client
package com.me.ws.client;
import com.me.ws.HelloWSImpl;
import com.me.ws.HelloWSImplService;
public class Client {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWSImpl helloWS = factory.getHelloWSImplPort();
System.out.println(helloWS.getClass());
String result = helloWS.sayHello("json");
System.out.println("client "+result);
}
}
5. 执行客户端代码发送WebService请求
结果