zoukankan      html  css  js  c++  java
  • 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());
            }
            
    
        }
    
    }
  • 相关阅读:
    有些事情,我们需要坚持到底
    SEO策略与细节:细节决定成败
    织梦DEDECMS更新6月7日补丁后出现版权链接的删除办法
    argparse模块的应用
    多态实现原理剖析
    tensorflow中tf.ConfigProto()用法解释
    tensor flow中summary用法总结
    tensorflow-gpu版本出现libcublas.so.8.0:cannot open shared object file
    python3自带工具2to3.py用法
    公司管理系统之设计
  • 原文地址:https://www.cnblogs.com/sankt/p/9309596.html
Copyright © 2011-2022 走看看