Web Service
什么是Web Service?
Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。也就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。可以认为web service是一个web版的Jar包或DLL.
也可以说Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。主流还是使用Java或者C#开发web service居多。
Web Service技术平台
XML
XML是在web上传送结构化数据的一种方式,现在更加主流则是 JSON. XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的 返回结果是什么)。XML主要的优点在于很好地解决了数据表示问题。 它既是平台无关的,又是厂商无关 的。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。
SOAP
SOAP使用XML消息调用远程方法,WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明 HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。 SOAP协议可以看成 HTTP协议和XML的组合。
WSDL
Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
UDDI
UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
WebService调用原理
对客户端而言,给WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,通过调用这些代理,就可以访问到webservice服务。
代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap 数据变成返回值返回。
对服务端而言,各类WebService框架的本质就是一个个Servlet,当远程调用客户端给它通过http协议发送过来 soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成 soap格式的数据,通过http响应消息回给客户端。
示例
1. Eclipse新建Dynamic web project,名称WebService1.添加HelloService和User类,点击运行,成功则出现消息:
Publish web service successfully.
1 package src; 2 3 import java.io.Serializable; 4 import java.util.Date; 5 6 public class User implements Serializable { 7 8 private static final long serialVersionUID = -5983087877633074633L; 9 private int id; 10 private String name; 11 private Date birthday; 12 13 public User(int id, String name, Date birthday) { 14 super(); 15 this.id = id; 16 this.name = name; 17 this.birthday = birthday; 18 } 19 public int getId() { 20 return id; 21 } 22 public void setId(int id) { 23 this.id = id; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public Date getBirthday() { 32 return birthday; 33 } 34 public void setBirthday(Date birthday) { 35 this.birthday = birthday; 36 } 37 38 @Override 39 public String toString() { 40 return "ID : "+ id + ", Name : " + name + ", Birthday : " + birthday; 41 } 42 }
1 package src; 2 3 import java.util.ArrayList; 4 import java.util.Date; 5 import java.util.List; 6 7 import javax.jws.WebMethod; 8 import javax.jws.WebService; 9 import javax.xml.ws.Endpoint; 10 11 //@WebService注解将此类发布为一个web service 12 @WebService 13 public class HelloService { 14 15 /* 16 * 1. @WebMethod注解会发布此方法 17 * 2. 静态方法和final方法不能被发布 18 * 3. @WebMentod(exclude=true),此方法不被发布 19 * 4. 类上添加注解@WebService,类中所有非静态方法都会默认被发布 20 */ 21 @WebMethod 22 public String getInfo(String info) { 23 return "Hello World. Info : " + info; 24 } 25 26 @WebMethod 27 public User getUser(int id) { 28 User user = null; 29 30 if (id == 1) { 31 user = new User(id, "Tom Lee", new Date()); 32 } 33 return user; 34 } 35 36 @WebMethod 37 public List<User> getUsers() { 38 List<User> list = new ArrayList<User>(); 39 User u1 = new User(100, "Alice Wong", new Date()); 40 User u2 = new User(200, "Lucy Yue", new Date()); 41 User u3 = new User(300, "Bob Luu", new Date()); 42 list.add(u1); 43 list.add(u2); 44 list.add(u3); 45 46 return list; 47 48 } 49 50 public static void main(String[] args) { 51 // Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。 52 // 发布端口可随意制定一个不被占用的号即可 53 // Service是固定的,后面的服务名字一般和类名保持一致 54 Endpoint.publish("http://localhost:8089/Service/HelloService", new HelloService()); 55 // 发布成功后 在浏览器输入http://localhost:8089/Service/HelloService?wsdl 56 System.out.println("Publish web service successfully."); 57 58 } 59 60 }
2. Eclipse新建Application Client Project后,项目名称为ClientApp1, 运行CMD命令,
C:\Users>wsimport -s C:\***\eclipse-workspace\ClientApp1\appClientModule -p src -keep http://localhost:8089/Service/HelloService?wsdl
-s 参数内容为项目所在的完整路径
-p 参数内容为代理类存放的包名
-keep 参数内容为web service的URL
成功则出现下面的信息,
正在解析 WSDL...
正在生成代码...
正在编译代码...
最后刷新项目,则出现如下代理类,
3. 继续在项目中添加Main.java, 点击运行查看结果,至此示例项目结束。
package src; import java.util.List; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub HelloService service = new HelloServiceService().getHelloServicePort(); String info = service.getInfo("TOM LEE"); System.out.println(info); User user = service.getUser(1); System.out.println(user.getId()); System.out.println(user.getName()); System.out.println(user.getBirthday()); List<User> users = service.getUsers(); for(User u : users) { System.out.println(u.getId()); System.out.println(u.getName()); System.out.println(u.getBirthday()); } } }