天天看點

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. import javax.xml.bind.annotation.XmlRootElement;
    3. @XmlRootElement
    4. public class User {
    5. private String firstName = "";
    6. public String getFirstName(){
    7. return this.firstName;
    8. }
    9. public void setFirstName(String firstName){
    10. this.firstName = firstName;
    11. }
    12. private String lastName = "";
    13. public String getLastName(){
    14. return this.lastName;
    15. }
    16. public void setLastName(String lastName){
    17. this.lastName = lastName;
    18. }
    19. private int age = 0;
    20. public int getAge(){
    21. return this.age;
    22. }
    23. public void setAge(int age){
    24. this.age = age;
    25. }
    26. }

第五步:建立服務實作類——UserService。

  1. package com.shewo.eshop.restws;
  2. import javax.ws.rs.Path;
  3. import javax.ws.rs.GET;
  4. import javax.ws.rs.core.MediaType;
  5. import javax.ws.rs.Produces;
  6. import com.shewo.eshop.model.*;
  7. @Path("UserService")
  8. public class UserService {
  9. @GET
  10. @Path("/getUser")
  11. @Produces(MediaType.APPLICATION_JSON)
  12. public User getUser() {
  13. User user = new User();
  14. user.setAge(10);
  15. user.setFirstName("Meili");
  16. user.setLastName("Wang");
  17. return user;
  18. }
  19. }

第六步:配置 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. <load-on-startup>1</load-on-startup>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>User REST Service</servlet-name>
  18. <url-pattern>/rest/*</url-pattern>
  19. </servlet-mapping>
  20. </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中跨域問題