Rest、Restful和Jersey

 

1、什么是REST?

REST不是"rest"这个单词

Representational State Transfer 直接翻译:表现层状态转移

找到的一种最好理解的说法是:URL定位资源,用HTTP动词GET,POST,DELETE,DETC)描述操作

Resource:资源,即数据。
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。

1,资源:资源就是网络上的一个实体,一段文本,一张图片等。资源总是要通过一种载体来反应它的内容。文本可以用TXT,也可以用HTML或者XML、图片可以用JPG格式或者PNG格式,JSON是现在最常用的资源表现形式。

2,统一接口。RESTful风格的数据元操作CRUD(create,delete,update,read)分别对应HTTP方法GET用来获取资源,DELETE用来删除资源,这样就统一了数据操作的接口,PUT用来更新资源,POST用来新建资源(也可以用于更新资源)。

3,URI。可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。一般的,每个资源至少有一个URI与之对应,最典型的URI就是URL。

4,无状态。所谓无状态即所有的资源都可以URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而变化。如果输入一个URL就可以得到指定员工的工资,则这种情况就是无状态的,由一个URL与之对应可以通过HTTP动词方法得到资源,这就是典型的RESTful风格。

REST原则:

   <1>网络上的所有事物都被抽象为资源

   <2> 每个资源都有一个唯一的资源标识符

   <3> 同一个资源具有多种表现形式(xml,json等)

   <4>  对资源的各种操作不会改变资源标识符

   <5> 所有的操作都是无状态的

总结:REST是一种架构风格,REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。

 

2、什么是Restful?

restful: 遵守了rest原则的web服务

理解:rest与restful相比,多了一个ful,就英语层面来说是一个形容词,restful翻译为中文为: “rest

是rest式的什么呢?答案是:rest式的应用,rest风格的web服务也是rest式的应用,rest式的web服务是一种ROA(TheResource-Oriented Architecture)(面向资源的架构),ROA听起来很高大上有没有。。

两者的联系与区别

restful是由rest派生出来的。

restful用法:

在Restful之前的操作:
http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息

RESTful用法:
http://127.0.0.1/user/1 GET  根据用户id查询用户数据
http://127.0.0.1/user  POST 新增用户
http://127.0.0.1/user  PUT 修改用户信息
http://127.0.0.1/user  DELETE 删除用户信息

之前的操作是没有问题的,大神认为是有问题的,有什么问题呢?你每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save,其实完全没有这个必要,我使用了get请求,就是查询.使用post请求,就是新增的请求,我的意图很明显,完全没有必要做描述,这就是为什么有了restful.   

符合REST架构设计的API是RESTful API.

资源类上的常用注解有:
@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。

3、什么是Jersey?

Jersey架包下载点击打开链接

Jersey 是一个Java规范(JAX-RS)下的基于Rest风格(轻量级RESTful风格)的Web Service开发框架。

 

4. Eclipse+ Jersey 实现Restful 服务:

本人的环境如下:

  • Eclipse
  • Jersey-1.19
  • Tomcat v8.0 Server

方法一:POJO支持

第一步:创建动态Web项目EShopRESTfulWS,依据如下图所示过程操作,最后点击“Finish”。

Rest、Restful和Jersey

Rest、Restful和Jersey

 

第二步:右击项目,选择Import菜单,加载jersey中必要的包,最后点击“Finish”。本项目中使用jersey-1.19版本,下载官方地址:https://jersey.java.net/download.html。

Rest、Restful和Jersey

Rest、Restful和Jersey

Rest、Restful和Jersey

 

第三步:右击WebContent\Web-INF\lib目录下刚导入的Jersey包,选择Import菜单项将包加入搜索路径中。

Rest、Restful和Jersey

 

第四步:创建POJO类——User。

 

 
    1. package com.shewo.eshop.model;

    2.  
    3. import javax.xml.bind.annotation.XmlRootElement;

    4.  
    5. @XmlRootElement

    6. public class User {

    7.  
    8. private String firstName = "";

    9. public String getFirstName(){

    10. return this.firstName;

    11. }

    12.  
    13. public void setFirstName(String firstName){

    14. this.firstName = firstName;

    15. }

    16.  
    17. private String lastName = "";

    18. public String getLastName(){

    19. return this.lastName;

    20. }

    21.  
    22. public void setLastName(String lastName){

    23. this.lastName = lastName;

    24. }

    25.  
    26. private int age = 0;

    27. public int getAge(){

    28. return this.age;

    29. }

    30.  
    31. public void setAge(int age){

    32. this.age = age;

    33. }

    34. }

  1.  

 

第五步:创建服务实现类——UserService。

 
  1. package com.shewo.eshop.restws;

  2.  
  3. import javax.ws.rs.Path;

  4. import javax.ws.rs.GET;

  5. import javax.ws.rs.core.MediaType;

  6. import javax.ws.rs.Produces;

  7.  
  8. import com.shewo.eshop.model.*;

  9.  
  10. @Path("UserService")

  11. public class UserService {

  12.  
  13. @GET

  14. @Path("/getUser")

  15. @Produces(MediaType.APPLICATION_JSON)

  16. public User getUser() {

  17. User user = new User();

  18. user.setAge(10);

  19. user.setFirstName("Meili");

  20. user.setLastName("Wang");

  21.  
  22. return user;

  23. }

  24. }

 

第六步:配置 web.xml文件,添加基于Servlet的部署 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

  5. id="WebApp_ID" version="3.1">

  6. <display-name>EShopRESTfulWS</display-name>

  7. <servlet>

  8. <servlet-name>User REST Service</servlet-name>

  9. <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

  10. <init-param>

  11. <param-name>com.sun.jersey.config.property.packages</param-name>

  12. <param-value>com.shewo.eshop.restws</param-value>

  13. </init-param>

  14.  
  15. <load-on-startup>1</load-on-startup>

  16. </servlet>

  17.  
  18. <servlet-mapping>

  19. <servlet-name>User REST Service</servlet-name>

  20. <url-pattern>/rest/*</url-pattern>

  21. </servlet-mapping>

  22. </web-app>


完成上述步骤后,可以右击项目,选择:RunAs-Run On Server,选择你所安装的HTTPServer,这里我用的是Tomcat v8.0 Server。如下图:

Rest、Restful和Jersey

 

点击“Finish”,运行Tomcat。这里需要注意:在此之前,本机不能有其它Tomcat实例在运行,否则会由于大家默认端口都为8080,从而造成冲突。
 

Server启动成功后,可以用如下URL测试:http://localhost:8080/EShopRESTfulWS/rest/UserService/getUser

网页中出现如下结果表示系统运行正常:{"age":"10","firstName":"Meili","lastName":"Wang"}

URL说明:

Rest、Restful和Jersey

参考文章:

 Eclipse+Jersey实现RESTful服务

 REST接口 

 

 Restful api 注释: REST 在 Java 中的使用

RESTful API中跨域问题