什么是Web Service?
Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。也就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。可以认为web service是一个web版的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 ????@Override39 ????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 service12 @WebService13 public class HelloService {14 15 ????/*16 ?????* 1. @WebMethod注解会发布此方法17 ?????* 2. 静态方法和final方法不能被发布18 ?????* 3. @WebMentod(exclude=true),此方法不被发布19 ?????* 4. 类上添加注解@WebService,类中所有非静态方法都会默认被发布20 ?????*/21 ????@WebMethod22 ????public String getInfo(String info) {23 ????????return "Hello World. Info : " + info;24 ????}25 ????26 ????@WebMethod27 ????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 ????@WebMethod37 ????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?wsdl56 ????????System.out.println("Publish web service successfully.");57 58 ????}59 60 }
2. Eclipse新建Application Client Project后,项目名称为ClientApp1, 运行CMD命令,
C:\Users\JimmyGates>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()); ???????} ???????????}}
Web Service
原文地址:https://www.cnblogs.com/sankt/p/9309596.html