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-workspaceClientApp1appClientModule -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());
        }
        

    }

}
原文地址:https://www.cnblogs.com/sankt/p/9309596.html