RESTful和RESTEasy

概述

RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTful Web Services和RESTful Java应用程序。它是JAX-RS规范的一个完整实现并通过JCP认证。
JAX-RS提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源。

标注包括

  • @Path,标注资源类或方法的相对路径;
  • @GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型;
  • @Produces,标注返回的MIME媒体类型
  • @Consumes,标注可接受请求的MIME媒体类型;
  • @PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam
    分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

JAX-RS

JAX-RS 是代表restful web service的一套规范API,JAX-RS规范基于JAVA编程语言,它是用来创建Restful 风格的web services服务的。Jax-rs使用一系列注解来简化java开发。
JAX-RS也称jsr339 (全称java specifications requests java规范提案第339个),由jcp(java community process)组织经过投票通过。

RESTful API

它是一种互联网应用程序的API设计理念:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
常用的HTTP动词有下面五个:

  • GET:读取(Read)
  • POST:新建(Create)
  • PUT:更新(Update)
  • PATCH:更新(Update),通常是部分更新
  • DELETE:删除(Delete)
GET /blog/getArticles --> GET /blog/Articles  获取所有文章
GET /blog/addArticles --> POST /blog/Articles  添加一篇文章
GET /blog/editArticles --> PUT /blog/Articles  修改一篇文章 
GET /rest/api/deleteArticles?id=1 --> DELETE /blog/Articles/1  删除一篇文章

RESTEasy?

简单地说,resteasy核心就是一个servlet前端控制器,理念都一样。
应该来说,resteasy的优势在于相比spring mvc而言,更加的专注,简单。就大型应用而言,绝对是spring mvc占据优势。
就简洁性而言,应该来说在spring 4.0引入spring restcontroller之后,优势就没有那么明显了,应该来说3.2之前对restful还不那么有信心。
就像我们现在发现基本上mvc上spring mvc占据了绝大部分的新项目,估计以后resteasy也会小众化。
至于说resteasy为什么活下来,感觉上spring社区有个比较明显的倾向就是好像不怎么吃螃蟹,等到趋势比较明朗之后,要么就整合对方,要么就强行自己引入一套接口玩死对方。

resteasy是JAX-RS的参考实现之一,规范制定者是核心人员之一,所以概念和属于上基本上完全各种restful service教材上能够直接对应。spring mvc方面,就没有那么直接的对应了,估计是鄙视J2EE的一种商业手法。
就应用而言,如果restful作为rpc的实现机制,resteasy应该是有优势的,毕竟集成没有spring mvc那么多配置(当然spring cloud除外),但作为应用,估计干不过spring mvc。
使用resteasy,最好使用servlet 3.0以上的容器,比如tomcat 7+。

springboot + resteasy依赖


    com.paypal.springboot
    resteasy-spring-boot-starter
    2.3.4-RELEASE


SpringMVC实现RestFul
SpringMVC+RestFul详细示例实战教程(实现跨域访问)

 @RestController  
    public class HelloWorldRestController {  
       
        @Autowired  
        UserService userService;  //Service which will do all data retrieval/manipulation work  
       
           
        //-------------------Retrieve All Users--------------------------------------------------------  
           
        @RequestMapping(value = "/user/", method = RequestMethod.GET)  
        public ResponseEntity> listAllUsers() {  
            List users = userService.findAllUsers();  
            if(users.isEmpty()){  
                return new ResponseEntity>(HttpStatus.NO_CONTENT);//You many decide to return HttpStatus.NOT_FOUND  
            }  
            return new ResponseEntity>(users, HttpStatus.OK);  
        }  
       
       
        //-------------------Retrieve Single User--------------------------------------------------------  
           
        @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  
        public ResponseEntity getUser(@PathVariable("id") long id) {  
            System.out.println("Fetching User with id " + id);  
            User user = userService.findById(id);  
            if (user == null) {  
                System.out.println("User with id " + id + " not found");  
                return new ResponseEntity(HttpStatus.NOT_FOUND);  
            }  
            return new ResponseEntity(user, HttpStatus.OK);  
        }  
       
           
           
        //-------------------Create a User--------------------------------------------------------  
           
        @RequestMapping(value = "/user/", method = RequestMethod.POST)  
        public ResponseEntity createUser(@RequestBody User user,    UriComponentsBuilder ucBuilder) {  
            System.out.println("Creating User " + user.getName());  
       
            if (userService.isUserExist(user)) {  
                System.out.println("A User with name " + user.getName() + " already exist");  
                return new ResponseEntity(HttpStatus.CONFLICT);  
            }  
       
            userService.saveUser(user);  
       
            HttpHeaders headers = new HttpHeaders();  
            headers.setLocation(ucBuilder.path("/user/{id}").buildAndExpand(user.getId()).toUri());  
            return new ResponseEntity(headers, HttpStatus.CREATED);  
        }  
       
           
        //------------------- Update a User --------------------------------------------------------  
           
        @RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)  
        public ResponseEntity updateUser(@PathVariable("id") long id, @RequestBody User user) {  
            System.out.println("Updating User " + id);  
               
            User currentUser = userService.findById(id);  
               
            if (currentUser==null) {  
                System.out.println("User with id " + id + " not found");  
                return new ResponseEntity(HttpStatus.NOT_FOUND);  
            }  
       
            currentUser.setName(user.getName());  
            currentUser.setAge(user.getAge());  
            currentUser.setSalary(user.getSalary());  
               
            userService.updateUser(currentUser);  
            return new ResponseEntity(currentUser, HttpStatus.OK);  
        }  
       
        //------------------- Delete a User --------------------------------------------------------  
           
        @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)  
        public ResponseEntity deleteUser(@PathVariable("id") long id) {  
            System.out.println("Fetching & Deleting User with id " + id);  
       
            User user = userService.findById(id);  
            if (user == null) {  
                System.out.println("Unable to delete. User with id " + id + " not found");  
                return new ResponseEntity(HttpStatus.NOT_FOUND);  
            }  
       
            userService.deleteUserById(id);  
            return new ResponseEntity(HttpStatus.NO_CONTENT);  
        }  
       
           
        //------------------- Delete All Users --------------------------------------------------------  
           
        @RequestMapping(value = "/user/", method = RequestMethod.DELETE)  
        public ResponseEntity deleteAllUsers() {  
            System.out.println("Deleting All Users");  
       
            userService.deleteAllUsers();  
            return new ResponseEntity(HttpStatus.NO_CONTENT);  
        }  
       
    }  

RestTemplate

传统情况下在Java代码里访问RESTful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。Spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
使用RestTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。

RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型
RestTemplate 提供了高级方法,来响应者6种主要的HTTP方法。
HTTP 方法和对应的 RestTemplate方法:

  • HTTP GET : getForObject, getForEntity
  • HTTP PUT : put(String url, Object request, String…​urlVariables)
  • HTTP DELETE : delete
  • HTTP POST : postForLocation(String url, Object request, String…​ urlVariables), postForObject(String url,Object request, ClassresponseType, String…​ uriVariables)
  • HTTP HEAD : headForHeaders(String url, String…​ urlVariables)
  • HTTP OPTIONS : optionsForAllow(String url, String…​ urlVariables)
  • HTTP PATCH and others : exchange execute
public class SpringRestTestClient {  
       
        public static final String REST_SERVICE_URI = "http://localhost:8080/Spring4MVCCRUDRestService";  
           
        /* GET */  
        @SuppressWarnings("unchecked")  
        private static void listAllUsers(){  
            System.out.println("Testing listAllUsers API-----------");  
               
            RestTemplate restTemplate = new RestTemplate();  
            List> usersMap = restTemplate.getForObject(REST_SERVICE_URI+"/user/", List.class);  
               
            if(usersMap!=null){  
                for(LinkedHashMap map : usersMap){  
                    System.out.println("User : id="+map.get("id")+", Name="+map.get("name")+", Age="+map.get("age")+", Salary="+map.get("salary"));;  
                }  
            }else{  
                System.out.println("No user exist----------");  
            }  
        }  
           
        /* GET */  
        private static void getUser(){  
            System.out.println("Testing getUser API----------");  
            RestTemplate restTemplate = new RestTemplate();  
            User user = restTemplate.getForObject(REST_SERVICE_URI+"/user/1", User.class);  
            System.out.println(user);  
        }  
           
        /* POST */  
        private static void createUser() {  
            System.out.println("Testing create User API----------");  
            RestTemplate restTemplate = new RestTemplate();  
            User user = new User(0,"Sarah",51,134);  
            URI uri = restTemplate.postForLocation(REST_SERVICE_URI+"/user/", user, User.class);  
            System.out.println("Location : "+uri.toASCIIString());  
        }  
       
        /* PUT */  
        private static void updateUser() {  
            System.out.println("Testing update User API----------");  
            RestTemplate restTemplate = new RestTemplate();  
            User user  = new User(1,"Tomy",33, 70000);  
            restTemplate.put(REST_SERVICE_URI+"/user/1", user);  
            System.out.println(user);  
        }  
       
        /* DELETE */  
        private static void deleteUser() {  
            System.out.println("Testing delete User API----------");  
            RestTemplate restTemplate = new RestTemplate();  
            restTemplate.delete(REST_SERVICE_URI+"/user/3");  
        }  
       
       
        /* DELETE */  
        private static void deleteAllUsers() {  
            System.out.println("Testing all delete Users API----------");  
            RestTemplate restTemplate = new RestTemplate();  
            restTemplate.delete(REST_SERVICE_URI+"/user/");  
        }  
    }   

你可能感兴趣的:(RESTful和RESTEasy)