• 如何封装RESTful Web Service


    所谓Web Service是一个平台独立的,低耦合的,自包含的、可编程的Web应用程序,有了Web Service异构系统之间就可以通过XML或JSON来交换数据,这样就可以用于开发分布式的互操作的应用程序。Web Service使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件就可相互交换数据或集成,无论它们各自所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。 
      REST(REpresentational State Transfer)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。近年来,越来越多的Web Service开始采用REST风格设计和实现。例如,亚马逊提供接近REST风格的Web Service进行图书查找;雅虎提供的Web Service也是REST风格的。

    这里写图片描述


    这里写图片描述

      如果要对REST有更深入的了解和更深刻的认识,推荐大家阅读InfoQ上面的一篇文章《理解本真的REST架构风格》。相信很多自以为懂REST的人看完这篇文章之后才知道什么是真正的REST。在IBM的开发者社区中有一篇非常好的文章,名为《使用Spring 3来创建RESTful Web Services》,讲解如何用springWeb和Spring MVC来创建REST风格的Web Service。由于这篇文章已经讲得很好了,这里我就不再赘述其中的内容。

      这里要讲的是基于Apache CXF来创建RESTful Web Service。可以在Apache的网站下载到CXF的发行版本。Apache的官网是这样介绍CXF的:

    Apache CXF is an open source services framework. CXF helps you build and develop services using frontend programming APIs, like JAX-WS and JAX-RS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.

      下载完成后解压并找到lib目录,将其中的jar文件添加你的Java项目中,接下来就可以开始编写你的Web Service程序了。话不多说,直接上代码。

    package com.lovo.domain;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Student")
    public class Student {  
        private Integer id;
        private String name;
        private String birthday;
    
        public Student() {
        }
    
        public Student(Integer id, String name, String birthday) {
            this.id = id;
            this.name = name;
            this.birthday = birthday;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
    }
    
    package com.lovo.infrastructure;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.lovo.domain.Student;
    
    public class StudentRepository {
        private Map<Integer, Student> map = new HashMap<>();
    
        public StudentRepository() {
            map.put(1001, new Student(1001, "骆昊", "1980-11-28"));
            map.put(1002, new Student(1002, "王大锤", "1992-2-2"));
            map.put(1003, new Student(1003, "张三丰", "1930-3-3"));
        }
    
        public void save(Student student) {
            if (student != null) {
                map.put(student.getId(), student);
            }
        }
    
        public void delete(Student student) {
            if (student != null && map.containsKey(student.getId())) {
                map.remove(student.getId());
            }
        }
    
        public void update(Student student) {
            delete(student);
            save(student);
        }
    
        public Student findById(Integer id) {
            return map.get(id);
        }
    
        public List<Student> findAll() {
            return new ArrayList<Student>(map.values());
        }
    }
    package com.lovo.service;
    
    import java.util.List;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.DELETE;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.PUT;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    
    import com.lovo.domain.Student;
    import com.lovo.infrastructure.StudentRepository;
    
    @Path("/service")
    @Produces("application/json")
    public class StudentService {
        private StudentRepository studentRepo = new StudentRepository();
    
        @GET
        @Path("/stu/{id}")
        @Consumes("application/json")
        public Student getStudent(@PathParam("id") Integer id) {
            return studentRepo.findById(id);
        }
    
        @GET
        @Path("/stu")
        @Consumes("application/json")
        public List<Student> getAllStudents() {
            return studentRepo.findAll();
        }
    
        @POST
        @Path("/stu")
        @Consumes("application/json")
        public boolean addStudent(Student student) {
            if (getStudent(student.getId()) == null) {
                studentRepo.save(student);
                return true;
            }
            return false;
        }
    
        @PUT
        @Path("/stu/{id}")
        @Consumes("application/json")
        public boolean updateStudent(@PathParam("id") Integer id, Student student) {
            if (getStudent(id) != null) {
                studentRepo.update(student);
                return true;
            }
            return false;
        }
    
        @DELETE
        @Path("/stu/{id}")
        @Consumes("application/json")
        public boolean deleteStudent(@PathParam("id") Integer id) {
            Student student = getStudent(id);
            if (student != null) {
                studentRepo.delete(student);
                return true;
            }
            return false;
        }
    }
    

      最后来启动Web Service的服务器并进行测试

    package com.lovo;
    
    import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
    
    import com.lovo.domain.Student;
    import com.lovo.service.StudentService;
    
    public class MyRestServer {  
    
        public static void main(String[] args) {
            JAXRSServerFactoryBean myRESTfulServer = new JAXRSServerFactoryBean();
            myRESTfulServer.setResourceClasses(Student.class);  
            myRESTfulServer.setServiceBean(new StudentService());
            myRESTfulServer.setAddress("http://localhost:9999/");  
            myRESTfulServer.create();  
        }  
    } 

      在浏览器中分别输入以下两个URI查看结果: 
    http://localhost:9999/service/stu/1002 
    这里写图片描述

    http://localhost:9999/service/stu 
    这里写图片描述

  • 相关阅读:
    MySQL STR_TO_DATE函数
    mybatis的一种批量更新方法【我】
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    Unity寻路的功能总结
    Unity3d大会的部分总结
    支付宝Unity
    [Firefly引擎][学习笔记三][已完结]所需模块封装
    [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
    [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室
    [Firefly引擎][学习笔记四][已完结]服务器端与客户端的通讯
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7156673.html
Copyright © 2020-2023  润新知