RESTful Web Services - Hướng dẫn nhanh

Kiến trúc REST là gì?

REST là viết tắt của REpresentational State Transfer. REST là kiến ​​trúc dựa trên tiêu chuẩn web và sử dụng Giao thức HTTP. Nó xoay quanh tài nguyên trong đó mọi thành phần đều là tài nguyên và tài nguyên được truy cập bởi một giao diện chung sử dụng các phương thức chuẩn HTTP. REST lần đầu tiên được giới thiệu bởi Roy Fielding vào năm 2000.

Trong kiến ​​trúc REST, REST Server chỉ đơn giản là cung cấp quyền truy cập vào tài nguyên và máy khách REST truy cập và sửa đổi tài nguyên. Ở đây, mỗi tài nguyên được xác định bằng các URI / ID toàn cầu. REST sử dụng các biểu diễn khác nhau để biểu diễn một tài nguyên như văn bản, JSON, XML. JSON là một trong những phổ biến nhất.

Phương thức HTTP

Bốn phương thức HTTP sau đây thường được sử dụng trong kiến ​​trúc dựa trên REST.

  • GET - Cung cấp quyền truy cập chỉ đọc vào một tài nguyên.

  • POST - Được sử dụng để tạo một tài nguyên mới.

  • DELETE - Được sử dụng để loại bỏ một tài nguyên.

  • PUT - Được sử dụng để cập nhật một tài nguyên hiện có hoặc tạo một tài nguyên mới.

Giới thiệu về dịch vụ web RESTFul

Dịch vụ web là một tập hợp các giao thức và tiêu chuẩn mở được sử dụng để trao đổi dữ liệu giữa các ứng dụng hoặc hệ thống. Các ứng dụng phần mềm được viết bằng nhiều ngôn ngữ lập trình khác nhau và chạy trên các nền tảng khác nhau có thể sử dụng các dịch vụ web để trao đổi dữ liệu qua các mạng máy tính như Internet theo cách tương tự như giao tiếp giữa các quá trình trên một máy tính. Khả năng tương tác này (ví dụ: giữa Java và Python, hoặc các ứng dụng Windows và Linux) là do việc sử dụng các tiêu chuẩn mở.

Các dịch vụ web dựa trên Kiến trúc REST được gọi là các dịch vụ web RESTful. Các dịch vụ web này sử dụng các phương thức HTTP để triển khai khái niệm kiến ​​trúc REST. Dịch vụ web RESTful thường xác định một URI, Định danh tài nguyên đồng nhất một dịch vụ, cung cấp biểu diễn tài nguyên như JSON và tập hợp các Phương thức HTTP.

Tạo dịch vụ trang web RESTFul

Trong các chương tiếp theo, chúng tôi sẽ tạo một dịch vụ web nói rằng quản lý người dùng với các chức năng sau:

Sr.No. URI Phương thức HTTP ĐĂNG nội dung Kết quả
1 / UserService / người dùng ĐƯỢC trống Hiển thị danh sách tất cả người dùng.
2 / UserService / addUser BÀI ĐĂNG Chuỗi JSON Thêm thông tin chi tiết của người dùng mới.
3 / UserService / getUser /: id ĐƯỢC trống Hiển thị chi tiết của một người dùng.

Hướng dẫn này sẽ hướng dẫn bạn cách chuẩn bị một môi trường phát triển để bắt đầu công việc của bạn Jersey Frameworkđể tạo các Dịch vụ Web RESTful. Khuôn khổ Jersey triển khaiJAX-RS 2.0API, là một đặc tả tiêu chuẩn để tạo các Dịch vụ Web RESTful. Hướng dẫn này cũng sẽ dạy bạn cách thiết lậpJDK, TomcatEclipse trên máy của bạn trước khi bạn thiết lập Jersey Framework.

Thiết lập Bộ phát triển Java (JDK)

Bạn có thể tải xuống phiên bản SDK mới nhất từ ​​trang web Java của Oracle - Java SE Downloads . Bạn sẽ tìm thấy hướng dẫn cài đặt JDK trong các tệp đã tải xuống. Làm theo hướng dẫn đã cho để cài đặt và định cấu hình thiết lập. Cuối cùng thiết lậpPATHJAVA_HOME biến môi trường để tham chiếu đến thư mục chứa JavaJavac, thường là java_install_dir / bin và java_install_dir tương ứng.

Nếu bạn đang chạy Windows và cài đặt JDK trong C: \ jdk1.7.0_75, bạn sẽ phải đặt dòng sau vào tệp C: \ autoexec.bat của mình.

set PATH = C:\jdk1.7.0_75\bin;%PATH% 
set JAVA_HOME = C:\jdk1.7.0_75

Ngoài ra, trên Windows NT / 2000 / XP, bạn cũng có thể nhấp chuột phải vào Máy tính của tôi → chọn Thuộc tính → sau đó Nâng cao → sau đó Biến môi trường. Sau đó, bạn sẽ cập nhật giá trị PATH và nhấn nút OK.

Trên Unix (Solaris, Linux, v.v.), nếu SDK được cài đặt trong /usr/local/jdk1.7.0_75 và bạn sử dụng C Shell, bạn sẽ đưa phần sau vào tệp .cshrc của mình.

setenv PATH /usr/local/jdk1.7.0_75/bin:$PATH 
setenv JAVA_HOME /usr/local/jdk1.7.0_75

Ngoài ra, nếu bạn sử dụng Môi trường phát triển tích hợp (IDE) như Borland JBuilder, Eclipse, IntelliJ IDEA hoặc Sun ONE Studio, hãy biên dịch và chạy một chương trình đơn giản để xác nhận rằng IDE biết bạn đã cài đặt Java ở đâu, nếu không hãy thiết lập đúng như tài liệu đã cho của IDE.

Thiết lập IDE Eclipse

Tất cả các ví dụ trong hướng dẫn này đã được viết bằng IDE Eclipse. Vì vậy, tôi khuyên bạn nên cài đặt phiên bản Eclipse mới nhất trên máy của mình.

Để cài đặt Eclipse IDE, hãy tải xuống các tệp nhị phân Eclipse mới nhất từ https://www.eclipse.org/downloads/. Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân đến một vị trí thuận tiện. Ví dụ: trong C: \ eclipse trên windows hoặc / usr / local / eclipse trên Linux / Unix và cuối cùng đặt biến PATH một cách thích hợp.

Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy windows, hoặc bạn có thể chỉ cần nhấp đúp vào eclipse.exe.

%C:\eclipse\eclipse.exe

Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -

$/usr/local/eclipse/eclipse

Sau khi khởi động thành công, nếu mọi thứ đều ổn thì màn hình của bạn sẽ hiển thị kết quả sau:

Thiết lập Thư viện Khung Jersey

Bây giờ, nếu mọi thứ đều ổn, thì bạn có thể tiến hành thiết lập khung công tác Jersey. Sau đây là một vài bước đơn giản để tải xuống và cài đặt framework trên máy tính của bạn.

  • Hãy chọn xem bạn muốn cài đặt Jersey trên Windows hay Unix, sau đó tiến hành bước tiếp theo để tải xuống tệp .zip cho windows và sau đó là tệp .tz cho Unix.

  • Tải xuống phiên bản mới nhất của nhị phân khuôn khổ Jersey từ liên kết sau: https://jersey.java.net/download.html.

  • Tại thời điểm viết hướng dẫn này, tôi đã tải xuống jaxrs-ri-2.17.zip trên máy Windows của tôi và khi bạn giải nén tệp đã tải xuống, nó sẽ cung cấp cho bạn cấu trúc thư mục bên trong E: \ jaxrs-ri-2.17 \ jaxrs-ri như thể hiện trong ảnh chụp màn hình sau.

Bạn sẽ tìm thấy tất cả các thư viện Jersey trong các thư mục C:\jaxrs-ri-2.17\jaxrs-ri\lib và phụ thuộc vào C:\jaxrs-ri-2.17\jaxrs-ri\ext. Đảm bảo bạn đặt biến CLASSPATH của mình trên thư mục này đúng cách, nếu không bạn sẽ gặp sự cố khi chạy ứng dụng của mình. Nếu bạn đang sử dụng Eclipse, thì không bắt buộc phải đặt CLASSPATH vì tất cả các cài đặt sẽ được thực hiện thông qua Eclipse.

Thiết lập Apache Tomcat

Bạn có thể tải xuống phiên bản Tomcat mới nhất từ https://tomcat.apache.org/. Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân vào một vị trí thuận tiện. Ví dụ trong C: \ apache-tomcat-7.0.59 trên windows hoặc /usr/local/apache-tomcat-7.0.59 trên Linux / Unix và đặt biến môi trường CATALINA_HOME trỏ đến vị trí cài đặt.

Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy windows hoặc bạn có thể chỉ cần nhấp đúp vào startup.bat.

%CATALINA_HOME%\bin\startup.bat

hoặc là

C:\apache-tomcat-7.0.59\bin\startup.bat

Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -

$CATALINA_HOME/bin/startup.sh

hoặc là

/usr/local/apache-tomcat-7.0.59/bin/startup.sh

Sau khi khởi động thành công, các ứng dụng web mặc định đi kèm với Tomcat sẽ khả dụng bằng cách truy cập http://localhost:8080/. Nếu mọi thứ đều ổn thì nó sẽ hiển thị kết quả sau:

Thông tin thêm về cấu hình và chạy Tomcat có thể được tìm thấy trong tài liệu có trên trang này. Thông tin này cũng có thể được tìm thấy trên trang web Tomcat -https://tomcat.apache.org.

Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy tính Windows:

%CATALINA_HOME%\bin\shutdown

hoặc là

C:\apache-tomcat-7.0.59\bin\shutdown

Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -

$CATALINA_HOME/bin/shutdown.sh

hoặc là

/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh

Khi bạn đã hoàn thành bước cuối cùng này, bạn đã sẵn sàng tiếp tục cho ví dụ Jersey đầu tiên mà bạn sẽ thấy trong chương tiếp theo.

Hãy để chúng tôi bắt đầu viết các dịch vụ web RESTful thực tế với Jersey Framework. Trước khi bắt đầu viết ví dụ đầu tiên bằng cách sử dụng Jersey Framework, bạn phải đảm bảo rằng bạn đã thiết lập môi trường Jersey đúng cách như được giải thích trong chương RESTful Web Services - Environment Setup . Ở đây, tôi cũng giả định rằng bạn có một ít kiến ​​thức về Eclipse IDE.

Vì vậy, chúng ta hãy tiến hành viết một Ứng dụng Jersey đơn giản sẽ hiển thị một phương thức dịch vụ web để hiển thị danh sách người dùng.

Tạo một dự án Java

Bước đầu tiên là tạo một Dự án Web Động bằng Eclipse IDE. Làm theo tùy chọnFile → New → Project và cuối cùng chọn Dynamic Web Projectwizard từ danh sách wizard. Bây giờ đặt tên cho dự án của bạn làUserManagement bằng cách sử dụng cửa sổ hướng dẫn như trong ảnh chụp màn hình sau -

Khi dự án của bạn được tạo thành công, bạn sẽ có nội dung sau trong Project Explorer -

Thêm các thư viện bắt buộc

Bước thứ hai, chúng ta hãy thêm Jersey Framework và các phụ thuộc của nó (thư viện) vào dự án của chúng ta. Sao chép tất cả các lọ từ các thư mục sau của thư mục zip jersey tải xuống trong thư mục WEB-INF / lib của dự án.

  • \jaxrs-ri-2.17\jaxrs-ri\api
  • \jaxrs-ri-2.17\jaxrs-ri\ext
  • \jaxrs-ri-2.17\jaxrs-ri\lib

Bây giờ, nhấp chuột phải vào tên dự án của bạn UserManagement và sau đó làm theo tùy chọn có sẵn trong menu ngữ cảnh - Build Path → Configure Build Path để hiển thị cửa sổ Java Build Path.

Bây giờ sử dụng Add JARs nút có sẵn dưới Libraries để thêm các JAR có trong thư mục WEBINF / lib.

Tạo tệp nguồn

Bây giờ chúng ta hãy tạo các tệp nguồn thực sự trong UserManagementdự án. Đầu tiên, chúng ta cần tạo một gói có têncom.tutorialspoint. Để làm điều này, nhấp chuột phải vào src trong phần trình khám phá gói và làm theo tùy chọn -New → Package.

Tiếp theo chúng ta sẽ tạo UserService.java, User.java,UserDao.java các tệp trong gói com.tutorialspoint.

User.java

package com.tutorialspoint;  

import java.io.Serializable;  
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
@XmlRootElement(name = "user") 

public class User implements Serializable {  
   private static final long serialVersionUID = 1L; 
   private int id; 
   private String name; 
   private String profession;  
   public User(){} 
    
   public User(int id, String name, String profession){  
      this.id = id; 
      this.name = name; 
      this.profession = profession; 
   }  
   public int getId() { 
      return id; 
   }  
   @XmlElement 
   public void setId(int id) { 
      this.id = id; 
   } 
   public String getName() { 
      return name; 
   } 
   @XmlElement
   public void setName(String name) { 
      this.name = name; 
   } 
   public String getProfession() { 
      return profession; 
   } 
   @XmlElement 
   public void setProfession(String profession) { 
      this.profession = profession; 
   }   
}

UserDao.java

package com.tutorialspoint;  

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException;  
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.ArrayList; 
import java.util.List;  

public class UserDao { 
   public List<User> getAllUsers(){ 
      
      List<User> userList = null; 
      try { 
         File file = new File("Users.dat"); 
         if (!file.exists()) { 
            User user = new User(1, "Mahesh", "Teacher"); 
            userList = new ArrayList<User>(); 
            userList.add(user); 
            saveUserList(userList); 
         } 
         else{ 
            FileInputStream fis = new FileInputStream(file); 
            ObjectInputStream ois = new ObjectInputStream(fis); 
            userList = (List<User>) ois.readObject(); 
            ois.close(); 
         } 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
      }   
      return userList; 
   } 
   private void saveUserList(List<User> userList){ 
      try { 
         File file = new File("Users.dat"); 
         FileOutputStream fos;  
         fos = new FileOutputStream(file); 
         ObjectOutputStream oos = new ObjectOutputStream(fos); 
         oos.writeObject(userList); 
         oos.close(); 
      } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } 
   }    
}

UserService.java

package com.tutorialspoint;  

import java.util.List; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType;  
@Path("/UserService") 

public class UserService {  
   UserDao userDao = new UserDao();  
   @GET 
   @Path("/users") 
   @Produces(MediaType.APPLICATION_XML) 
   public List<User> getUsers(){ 
      return userDao.getAllUsers(); 
   }  
}

Có hai điểm quan trọng cần lưu ý về chương trình chính,

UserService.java

  • Bước đầu tiên là chỉ định một đường dẫn cho dịch vụ web bằng cách sử dụng chú thích @Path tới UserService.

  • Bước thứ hai là chỉ định một đường dẫn cho phương thức dịch vụ web cụ thể bằng cách sử dụng chú thích @Path cho phương thức của UserService.

Tạo tệp cấu hình Web.xml

Bạn cần tạo tệp Cấu hình xml Web là tệp XML và được sử dụng để chỉ định servlet khung Jersey cho ứng dụng của chúng tôi.

web.xml

<?xml version = "1.0" encoding = "UTF-8"?> 
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"  
   xmlns = "http://java.sun.com/xml/ns/javaee"  
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
   id = "WebApp_ID" version = "3.0"> 
   <display-name>User Management</display-name> 
   <servlet> 
      <servlet-name>Jersey RESTful Application</servlet-name> 
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
      <init-param> 
         <param-name>jersey.config.server.provider.packages</param-name> 
         <param-value>com.tutorialspoint</param-value> 
      </init-param> 
   </servlet> 
   <servlet-mapping> 
      <servlet-name>Jersey RESTful Application</servlet-name> 
      <url-pattern>/rest/*</url-pattern> 
   </servlet-mapping>   
</web-app>

Triển khai chương trình

Khi bạn đã hoàn tất việc tạo tệp nguồn và tệp cấu hình web, bạn đã sẵn sàng cho bước biên dịch và chạy chương trình của bạn. Để thực hiện việc này, sử dụng Eclipse, xuất ứng dụng của bạn dưới dạng tệp chiến tranh và triển khai tương tự trong tomcat.

Để tạo tệp WAR bằng nhật thực, hãy làm theo tùy chọn File → export → Web → War Filevà cuối cùng chọn UserManagement của dự án và thư mục đích. Để triển khai tệp war trong Tomcat, hãy đặt UserManagement.war trongTomcat Installation Directory → webapps directory và khởi động Tomcat.

Chạy chương trình

Chúng tôi đang sử dụng Postman , một tiện ích mở rộng của Chrome, để kiểm tra các dịch vụ web của chúng tôi.

Yêu cầu UserManagement để nhận danh sách tất cả người dùng. Đặt http: // localhost: 8080 / UserManagement / rest / UserService / users trong POSTMAN với yêu cầu GET và xem kết quả sau.

Xin chúc mừng, bạn đã tạo thành công Ứng dụng RESTful đầu tiên của mình.

Tài nguyên là gì?

Kiến trúc REST coi mọi nội dung như một tài nguyên. Các tài nguyên này có thể là Tệp Văn bản, Trang Html, Hình ảnh, Video hoặc Dữ liệu Kinh doanh Động. REST Server chỉ đơn giản cung cấp quyền truy cập vào tài nguyên và máy khách REST truy cập và sửa đổi tài nguyên. Tại đây, mỗi tài nguyên được xác định bởi URI / Global ID. REST sử dụng các biểu diễn khác nhau để biểu diễn một tài nguyên có Văn bản, JSON, XML. Các đại diện phổ biến nhất của tài nguyên là XML và JSON.

Đại diện các nguồn lực

Một tài nguyên trong REST là một đối tượng tương tự trong Lập trình hướng đối tượng hoặc giống như một thực thể trong cơ sở dữ liệu. Khi tài nguyên được xác định thì việc biểu diễn của nó sẽ được quyết định bằng cách sử dụng định dạng chuẩn để máy chủ có thể gửi tài nguyên theo định dạng đã nói ở trên và máy khách có thể hiểu cùng định dạng.

Ví dụ, trong chương RESTful Web Services - Ứng dụng đầu tiên , người dùng là một tài nguyên được trình bày bằng định dạng XML sau:

<user> 
   <id>1</id> 
   <name>Mahesh</name>
   <profession>Teacher</profession> 
</user>

Cùng một tài nguyên có thể được biểu diễn ở định dạng JSON như sau:

{ 
   "id":1, 
   "name":"Mahesh", 
   "profession":"Teacher" 
}

Trình bày tài nguyên tốt

REST không áp đặt bất kỳ hạn chế nào đối với định dạng của biểu diễn tài nguyên. Một máy khách có thể yêu cầu biểu diễn JSON trong khi một máy khách khác có thể yêu cầu biểu diễn XML của cùng một tài nguyên với máy chủ, v.v. Máy chủ REST có trách nhiệm chuyển cho máy khách tài nguyên ở định dạng mà máy khách hiểu.

Sau đây là một số điểm quan trọng cần được xem xét khi thiết kế định dạng biểu diễn của tài nguyên trong RESTful Web Services.

  • Understandability - Cả Máy chủ và Máy khách phải có thể hiểu và sử dụng định dạng biểu diễn của tài nguyên.

  • Completeness- Định dạng phải có thể đại diện cho một tài nguyên hoàn toàn. Ví dụ, một tài nguyên có thể chứa một tài nguyên khác. Định dạng phải có thể thể hiện cấu trúc đơn giản cũng như phức tạp của tài nguyên.

  • Linkablity - Một tài nguyên có thể có một liên kết với một tài nguyên khác, một định dạng phải có khả năng xử lý các tình huống như vậy.

Tuy nhiên, hiện tại hầu hết các dịch vụ web đang đại diện cho các tài nguyên bằng cách sử dụng định dạng XML hoặc JSON. Có rất nhiều thư viện và công cụ có sẵn để hiểu, phân tích cú pháp và sửa đổi dữ liệu XML và JSON.

RESTful Web Services sử dụng các giao thức HTTP như một phương tiện giao tiếp giữa máy khách và máy chủ. Máy khách gửi một thông báo dưới dạng Yêu cầu HTTP và máy chủ phản hồi dưới dạng Phản hồi HTTP. Kỹ thuật này được gọi là Nhắn tin. Các thông báo này chứa dữ liệu thông báo và siêu dữ liệu tức là thông tin về chính thông báo. Hãy để chúng tôi xem xét các thông báo HTTP Request và HTTP Response cho HTTP 1.1.

Yêu cầu HTTP

Yêu cầu HTTP có năm phần chính:

  • Verb - Cho biết các phương thức HTTP như GET, POST, DELETE, PUT, v.v.

  • URI - Định danh tài nguyên đồng nhất (URI) để xác định tài nguyên trên máy chủ.

  • HTTP Version- Cho biết phiên bản HTTP. Ví dụ: HTTP v1.1.

  • Request Header- Chứa siêu dữ liệu cho thông báo HTTP Request dưới dạng các cặp khóa-giá trị. Ví dụ: loại ứng dụng khách (hoặc trình duyệt), định dạng được ứng dụng khách hỗ trợ, định dạng của nội dung thư, cài đặt bộ nhớ cache, v.v.

  • Request Body - Nội dung tin nhắn hoặc Biểu diễn tài nguyên.

Phản hồi HTTP

Phản hồi HTTP có bốn phần chính:

  • Status/Response Code- Cho biết trạng thái Máy chủ cho tài nguyên được yêu cầu. Ví dụ: 404 có nghĩa là không tìm thấy tài nguyên và 200 nghĩa là phản hồi vẫn ổn.

  • HTTP Version- Cho biết phiên bản HTTP. Ví dụ HTTP v1.1.

  • Response Header- Chứa siêu dữ liệu cho thông báo HTTP Response dưới dạng các cặp keyvalue. Ví dụ: độ dài nội dung, loại nội dung, ngày phản hồi, loại máy chủ, v.v.

  • Response Body - Nội dung tin nhắn phản hồi hoặc Biểu diễn tài nguyên.

Thí dụ

Như chúng tôi đã giải thích trong chương RESTful Web Services - Ứng dụng đầu tiên , hãy đặt http: // localhost: 8080 / UserManagement / rest / UserService / người dùng vào POSTMAN với yêu cầu GET. Nếu bạn nhấp vào nút Xem trước gần nút gửi của Người đưa thư và sau đó nhấp vào nút Gửi, bạn có thể thấy kết quả sau.

Ở đây bạn có thể thấy, trình duyệt đã gửi một yêu cầu GET và nhận được một nội dung phản hồi là XML.

Định địa chỉ đề cập đến việc định vị một tài nguyên hoặc nhiều tài nguyên nằm trên máy chủ. Tương tự như vậy để xác định địa chỉ bưu điện của một người.

Mỗi tài nguyên trong kiến ​​trúc REST được xác định bằng URI (Định danh tài nguyên đồng nhất) của nó. URI có định dạng sau:

<protocol>://<service-name>/<ResourceType>/<ResourceID>

Mục đích của URI là định vị (các) tài nguyên trên máy chủ lưu trữ dịch vụ web. Một thuộc tính quan trọng khác của yêu cầu là ĐỘNG TỪ xác định thao tác sẽ được thực hiện trên tài nguyên. Ví dụ, trong chương RESTful Web Services - First Application , URI làhttp://localhost:8080/UserManagement/rest/UserService/users và ĐỘNG TỪ là GET.

Xây dựng một URI chuẩn

Sau đây là những điểm quan trọng cần được xem xét khi thiết kế URI:

  • Use Plural Noun- Sử dụng danh từ số nhiều để xác định nguồn lực. Ví dụ: chúng tôi đã sử dụng người dùng để xác định người dùng như một tài nguyên.

  • Avoid using spaces- Sử dụng dấu gạch dưới (_) hoặc dấu gạch ngang (-) khi sử dụng tên tài nguyên dài. Ví dụ: sử dụng Authorised thay vì% 20users được ủy quyền.

  • Use lowercase letters - Mặc dù URI không phân biệt chữ hoa chữ thường, nhưng một phương pháp hay là chỉ giữ url ở dạng chữ thường.

  • Maintain Backward Compatibility- Vì Dịch vụ Web là một dịch vụ công cộng, một URI sau khi được công khai sẽ luôn có sẵn. Trong trường hợp, URI được cập nhật, hãy chuyển hướng URI cũ hơn sang URI mới bằng mã Trạng thái HTTP, 300.

  • Use HTTP Verb- Luôn sử dụng HTTP Verb như GET, PUT và DELETE để thực hiện các thao tác trên tài nguyên. Sẽ không tốt khi sử dụng tên hoạt động trong URI.

Thí dụ

Sau đây là một ví dụ về một URI kém để tìm nạp người dùng.

http://localhost:8080/UserManagement/rest/UserService/getUser/1

Sau đây là một ví dụ về một URI tốt để tìm nạp người dùng.

http://localhost:8080/UserManagement/rest/UserService/users/1

Như chúng ta đã thảo luận trong các chương trước rằng RESTful Web Service sử dụng rất nhiều động từ HTTP để xác định hoạt động sẽ được thực hiện trên (các) tài nguyên được chỉ định. Bảng sau đây nêu các ví dụ về các Động từ HTTP được sử dụng phổ biến nhất.

Sr.No. Phương thức HTTP, URI và hoạt động

1

GET

http: // localhost: 8080 / UserManagement / rest / UserService / người dùng

Nhận danh sách người dùng.

(Chỉ đọc)

2

GET

http: // localhost: 8080 / UserManagement / rest / UserService / users / 1

Lấy người dùng Id 1

(Chỉ đọc)

3

PUT

http: // localhost: 8080 / UserManagement / rest / UserService / users / 2

Chèn Người dùng có Id 2

(Idempotent)

4

POST

http: // localhost: 8080 / UserManagement / rest / UserService / users / 2

Cập nhật Người dùng có Id 2

(Không có)

5

DELETE

http: // localhost: 8080 / UserManagement / rest / UserService / users / 1

Xóa người dùng có Id 1

(Idempotent)

6

OPTIONS

http: // localhost: 8080 / UserManagement / rest / UserService / người dùng

Liệt kê các hoạt động được hỗ trợ trong một dịch vụ web.

(Chỉ đọc)

7

HEAD

http: // localhost: 8080 / UserManagement / rest / UserService / người dùng

Chỉ trả về Tiêu đề HTTP, không trả về Nội dung.

(Chỉ đọc)

Những điểm sau đây cần được xem xét.

  • Hoạt động GET chỉ được đọc và an toàn.

  • Các hoạt động PUT và DELETE là không quan trọng, có nghĩa là kết quả của chúng sẽ luôn giống nhau, cho dù các hoạt động này được gọi bao nhiêu lần.

  • Hoạt động PUT và POST gần giống nhau với sự khác biệt chỉ nằm ở kết quả trong đó hoạt động PUT là không quan trọng và hoạt động POST có thể gây ra một kết quả khác.

Thí dụ

Hãy để chúng tôi cập nhật một Ví dụ được tạo trong chương RESTful Web Services - Ứng dụng đầu tiên để tạo một dịch vụ Web có thể thực hiện các hoạt động CRUD (Tạo, Đọc, Cập nhật, Xóa). Để đơn giản, chúng tôi đã sử dụng I / O tệp để thay thế các hoạt động của Cơ sở dữ liệu.

Hãy để chúng tôi cập nhật User.java, UserDao.javaUserService.java các tệp trong gói com.tutorialspoint.

User.java

package com.tutorialspoint; 

import java.io.Serializable;  
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
@XmlRootElement(name = "user") 

public class User implements Serializable {  
   private static final long serialVersionUID = 1L; 
   private int id; 
   private String name; 
   private String profession;  
   public User(){}  
   
   public User(int id, String name, String profession){ 
      this.id = id; 
      this.name = name; 
      this.profession = profession; 
   }  
    
   public int getId() {
      return id; 
   } 
   @XmlElement 
   public void setId(int id) { 
      this.id = id; 
   } 
   public String getName() { 
      return name; 
   } 
   @XmlElement 
      public void setName(String name) { 
      this.name = name; 
   } 
   public String getProfession() { 
      return profession; 
   } 
   @XmlElement 
   public void setProfession(String profession) { 
      this.profession = profession; 
   }   
   @Override 
   public boolean equals(Object object){ 
      if(object == null){ 
         return false; 
      }else if(!(object instanceof User)){ 
         return false; 
      }else { 
         User user = (User)object; 
         if(id == user.getId() 
            && name.equals(user.getName()) 
            && profession.equals(user.getProfession())){ 
               return true; 
         }
      } 
      return false; 
   }  
}

UserDao.java

package com.tutorialspoint;  

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.ArrayList; 
import java.util.List;  

public class UserDao { 
   public List<User> getAllUsers(){ 
      List<User> userList = null; 
      try { 
         File file = new File("Users.dat"); 
         if (!file.exists()) { 
            User user = new User(1, "Mahesh", "Teacher"); 
            userList = new ArrayList<User>(); 
            userList.add(user); 
            saveUserList(userList);   
         } 
         else{ 
            FileInputStream fis = new FileInputStream(file); 
            ObjectInputStream ois = new ObjectInputStream(fis); 
            userList = (List<User>) ois.readObject(); 
            ois.close(); 
         }
      } catch (IOException e) { 
         e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
      }   
      return userList; 
   }  
   public User getUser(int id){ 
      List<User> users = getAllUsers();  
      for(User user: users){ 
         if(user.getId() == id){ 
            return user; 
         } 
      } 
      return null; 
   }  
   public int addUser(User pUser){ 
      List<User> userList = getAllUsers(); 
      boolean userExists = false; 
      for(User user: userList){ 
         if(user.getId() == pUser.getId()){ 
            userExists = true; 
            break; 
         } 
      }   
      if(!userExists){ 
         userList.add(pUser); 
         saveUserList(userList); 
         return 1; 
      } 
      return 0; 
   }
   public int updateUser(User pUser){ 
      List<User> userList = getAllUsers();  
      for(User user: userList){ 
         if(user.getId() == pUser.getId()){ 
            int index = userList.indexOf(user);    
            userList.set(index, pUser); 
            saveUserList(userList); 
            return 1; 
         } 
      }   
      return 0; 
   }  
   public int deleteUser(int id){ 
      List<User> userList = getAllUsers();  
      for(User user: userList){ 
         if(user.getId() == id){ 
            int index = userList.indexOf(user);    
            userList.remove(index); 
            saveUserList(userList); 
            return 1;    
         } 
      }   
      return 0; 
   }  
   private void saveUserList(List<User> userList){ 
      try { 
         File file = new File("Users.dat"); 
         FileOutputStream fos;  
         fos = new FileOutputStream(file);
         ObjectOutputStream oos = new ObjectOutputStream(fos);   
         oos.writeObject(userList); 
         oos.close(); 
      } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } 
   } 
}

UserService.java

package com.tutorialspoint;  

import java.io.IOException; 
import java.util.List;  
import javax.servlet.http.HttpServletResponse; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.GET; 
import javax.ws.rs.OPTIONS; 
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 javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType;  
@Path("/UserService") 

public class UserService { 
  
   UserDao userDao = new UserDao(); 
   private static final String SUCCESS_RESULT = "<result>success</result>"; 
   private static final String FAILURE_RESULT = "<result>failure</result>";  
   @GET 
   @Path("/users") 
   @Produces(MediaType.APPLICATION_XML) 
   public List<User> getUsers(){ 
      return userDao.getAllUsers(); 
   }  
   @GET 
   @Path("/users/{userid}") 
   @Produces(MediaType.APPLICATION_XML) 
   public User getUser(@PathParam("userid") int userid){ 
      return userDao.getUser(userid); 
   }  
   @PUT 
   @Path("/users") 
   @Produces(MediaType.APPLICATION_XML) 
   @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
   public String createUser(@FormParam("id") int id, 
      @FormParam("name") String name, 
      @FormParam("profession") String profession, 
      @Context HttpServletResponse servletResponse) throws IOException{ 
      User user = new User(id, name, profession); 
      int result = userDao.addUser(user); 
      if(result == 1){ 
         return SUCCESS_RESULT; 
      } 
      return FAILURE_RESULT; 
   }  
   @POST 
   @Path("/users")  
   @Produces(MediaType.APPLICATION_XML)
   @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
   public String updateUser(@FormParam("id") int id, 
      @FormParam("name") String name, 
      @FormParam("profession") String profession, 
      @Context HttpServletResponse servletResponse) throws IOException{ 
      User user = new User(id, name, profession); 
      int result = userDao.updateUser(user); 
      if(result == 1){ 
         return SUCCESS_RESULT; 
      } 
      return FAILURE_RESULT; 
   }  
   @DELETE 
   @Path("/users/{userid}") 
   @Produces(MediaType.APPLICATION_XML) 
   public String deleteUser(@PathParam("userid") int userid){ 
      int result = userDao.deleteUser(userid); 
      if(result == 1){ 
         return SUCCESS_RESULT; 
      } 
      return FAILURE_RESULT; 
   }  
   @OPTIONS 
   @Path("/users") 
   @Produces(MediaType.APPLICATION_XML) 
   public String getSupportedOperations(){ 
      return "<operations>GET, PUT, POST, DELETE</operations>"; 
   } 
}

Bây giờ sử dụng Eclipse, hãy xuất ứng dụng của bạn dưới dạng WAR Filevà triển khai tương tự trong Tomcat. Để tạo tệp WAR bằng eclipse, hãy làm theo đường dẫn sau:File → export → Web → War Filevà cuối cùng chọn UserManagement của dự án và thư mục đích. Để triển khai tệp WAR trong Tomcat, hãy đặt UserManagement.war trongTomcat Installation Directory → webapps thư mục và bắt đầu Tomcat.

Kiểm tra Dịch vụ Web

Jersey cung cấp các API để tạo một Máy khách Dịch vụ Web để kiểm tra các dịch vụ web. Chúng tôi đã tạo một lớp thử nghiệm mẫuWebServiceTester.java theo gói com.tutorialspoint trong cùng một dự án.

WebServiceTester.java

package com.tutorialspoint;  

import java.util.List; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.core.Form; 
import javax.ws.rs.core.GenericType; 
import javax.ws.rs.core.MediaType;  

public class WebServiceTester  {  
   private Client client; 
   private String REST_SERVICE_URL = "
   http://localhost:8080/UserManagement/rest/UserService/users"; 
   private static final String SUCCESS_RESULT = "<result>success</result>"; 
   private static final String PASS = "pass"; 
   private static final String FAIL = "fail";  
   private void init(){ 
      this.client = ClientBuilder.newClient(); 
   }  
   public static void main(String[] args){ 
      WebServiceTester tester = new WebServiceTester(); 
      //initialize the tester 
      tester.init(); 
      //test get all users Web Service Method 
      tester.testGetAllUsers(); 
      //test get user Web Service Method  
      tester.testGetUser();
      //test update user Web Service Method 
      tester.testUpdateUser(); 
      //test add user Web Service Method 
      tester.testAddUser(); 
      //test delete user Web Service Method 
      tester.testDeleteUser(); 
   } 
   //Test: Get list of all users 
   //Test: Check if list is not empty 
   private void testGetAllUsers(){ 
      GenericType<List<User>> list = new GenericType<List<User>>() {}; 
      List<User> users = client 
         .target(REST_SERVICE_URL) 
         .request(MediaType.APPLICATION_XML) 
         .get(list); 
      String result = PASS; 
      if(users.isEmpty()){ 
         result = FAIL; 
      } 
      System.out.println("Test case name: testGetAllUsers, Result: " + result ); 
   } 
   //Test: Get User of id 1 
   //Test: Check if user is same as sample user 
   private void testGetUser(){ 
      User sampleUser = new User(); 
      sampleUser.setId(1);  
      User user = client 
         .target(REST_SERVICE_URL) 
         .path("/{userid}") 
         .resolveTemplate("userid", 1) 
         .request(MediaType.APPLICATION_XML) 
         .get(User.class); 
      String result = FAIL; 
      if(sampleUser != null && sampleUser.getId() == user.getId()){
         result = PASS; 
      } 
      System.out.println("Test case name: testGetUser, Result: " + result ); 
   } 
   //Test: Update User of id 1 
   //Test: Check if result is success XML. 
   private void testUpdateUser(){ 
      Form form = new Form(); 
      form.param("id", "1"); 
      form.param("name", "suresh"); 
      form.param("profession", "clerk");  
      String callResult = client 
         .target(REST_SERVICE_URL) 
         .request(MediaType.APPLICATION_XML) 
         .post(Entity.entity(form, 
         MediaType.APPLICATION_FORM_URLENCODED_TYPE), 
         String.class); 
      String result = PASS; 
      if(!SUCCESS_RESULT.equals(callResult)){ 
         result = FAIL; 
      }  
      System.out.println("Test case name: testUpdateUser, Result: " + result); 
   } 
   //Test: Add User of id 2 
   //Test: Check if result is success XML. 
   private void testAddUser(){ 
      Form form = new Form(); 
      form.param("id", "2"); 
      form.param("name", "naresh"); 
      form.param("profession", "clerk");  
      String callResult = client 
         .target(REST_SERVICE_URL) 
         .request(MediaType.APPLICATION_XML) 
         .put(Entity.entity(form, 
         MediaType.APPLICATION_FORM_URLENCODED_TYPE), 
         String.class); 
    
      String result = PASS; 
      if(!SUCCESS_RESULT.equals(callResult)){ 
         result = FAIL; 
      }  
      System.out.println("Test case name: testAddUser, Result: " + result ); 
   } 
   //Test: Delete User of id 2 
   //Test: Check if result is success XML. 
   private void testDeleteUser(){ 
      String callResult = client 
         .target(REST_SERVICE_URL) 
         .path("/{userid}") 
         .resolveTemplate("userid", 2) 
         .request(MediaType.APPLICATION_XML) 
         .delete(String.class);  
      String result = PASS; 
      if(!SUCCESS_RESULT.equals(callResult)){ 
         result = FAIL; 
      } 
      System.out.println("Test case name: testDeleteUser, Result: " + result); 
   } 
}

Bây giờ hãy chạy trình thử nghiệm bằng Eclipse. Nhấp chuột phải vào tệp và làm theo tùy chọnRun as → Java Application. Bạn sẽ thấy kết quả sau trong bảng điều khiển Eclipse:

Test case name: testGetAllUsers, Result: pass 
Test case name: testGetUser, Result: pass 
Test case name: testUpdateUser, Result: pass 
Test case name: testAddUser, Result: pass 
Test case name: testDeleteUser, Result: pass

Theo kiến ​​trúc REST, một Dịch vụ Web RESTful không nên giữ trạng thái máy khách trên máy chủ. Hạn chế này được gọi là Không trạng thái. Máy khách có trách nhiệm chuyển ngữ cảnh của nó đến máy chủ và sau đó máy chủ có thể lưu trữ ngữ cảnh này để xử lý yêu cầu tiếp theo của máy khách. Ví dụ: phiên do máy chủ duy trì được xác định bằng mã định danh phiên do máy khách chuyển qua.

RESTful Web Services phải tuân thủ hạn chế này. Chúng ta đã thấy điều này trong chương RESTful Web Services - Method , rằng các phương thức dịch vụ web không lưu trữ bất kỳ thông tin nào từ máy khách mà chúng được gọi từ đó.

Consider the following URL −

https: // localhost: 8080 / UserManagement / rest / UserService / users / 1

Nếu bạn nhấn url ở trên bằng trình duyệt của mình hoặc sử dụng máy khách dựa trên java hoặc sử dụng Postman, kết quả sẽ luôn là User XML có Id là 1 vì máy chủ không lưu trữ bất kỳ thông tin nào về máy khách.

<user> 
   <id>1</id> 
   <name>mahesh</name> 
   <profession>1</profession> 
</user>

Ưu điểm của Không trạng thái

Sau đây là những lợi ích của trạng thái không trạng thái trong Dịch vụ Web RESTful -

  • Các dịch vụ web có thể xử lý từng yêu cầu phương thức một cách độc lập.

  • Các dịch vụ web không cần duy trì các tương tác trước đó của khách hàng. Nó đơn giản hóa thiết kế ứng dụng.

  • Vì bản thân HTTP là một giao thức không trạng thái, nên RESTful Web Services hoạt động liền mạch với các giao thức HTTP.

Nhược điểm của Không trạng thái

Sau đây là những nhược điểm của trạng thái không trạng thái trong Dịch vụ Web RESTful -

  • Các dịch vụ web cần có thêm thông tin trong mỗi yêu cầu và sau đó giải thích để có được trạng thái của khách hàng trong trường hợp các tương tác của khách hàng cần được quan tâm.

Bộ nhớ đệm đề cập đến việc lưu trữ phản hồi của máy chủ trong chính máy khách, để máy khách không cần lặp đi lặp lại yêu cầu máy chủ đối với cùng một tài nguyên. Phản hồi của máy chủ phải có thông tin về cách thực hiện vào bộ nhớ đệm để máy khách lưu phản hồi vào bộ nhớ cache trong một khoảng thời gian hoặc không bao giờ lưu phản hồi của máy chủ vào bộ nhớ cache.

Sau đây là các tiêu đề mà phản hồi của máy chủ có thể có để định cấu hình bộ nhớ đệm của máy khách:

Sr.No. Tiêu đề & Mô tả

1

Date

Ngày và giờ của tài nguyên khi nó được tạo.

2

Last Modified

Ngày và giờ của tài nguyên khi nó được sửa đổi lần cuối.

3

Cache-Control

Tiêu đề chính để kiểm soát bộ nhớ đệm.

4

Expires

Ngày hết hạn và thời gian lưu vào bộ nhớ đệm.

5

Age

Khoảng thời gian tính bằng giây kể từ khi tài nguyên được tìm nạp từ máy chủ.

Tiêu đề kiểm soát bộ nhớ cache

Sau đây là chi tiết của tiêu đề Cache-Control:

Sr.No. Chỉ thị & Mô tả

1

Public

Cho biết tài nguyên có thể lưu trong bộ nhớ cache bởi bất kỳ thành phần nào.

2

Private

Cho biết rằng tài nguyên chỉ có thể lưu vào bộ nhớ cache của máy khách và máy chủ, không có người trung gian nào có thể lưu vào bộ nhớ cache của tài nguyên.

3

no-cache/no-store

Chỉ ra rằng một tài nguyên không thể lưu vào bộ nhớ cache.

4

max-age

Cho biết bộ nhớ đệm có giá trị đến tuổi tối đa tính bằng giây. Sau đó, khách hàng phải thực hiện một yêu cầu khác.

5

must-revalidate

Chỉ báo cho máy chủ để xác thực lại tài nguyên nếu tuổi tối đa đã qua.

Thực hành tốt nhất

  • Luôn giữ cho các nội dung tĩnh như hình ảnh, CSS, JavaScript có thể lưu vào bộ nhớ cache với ngày hết hạn từ 2 đến 3 ngày.

  • Không bao giờ giữ hạn sử dụng quá cao.

  • Nội dung động chỉ nên được lưu vào bộ nhớ đệm trong vài giờ.

Vì Dịch vụ Web RESTful hoạt động với Đường dẫn URL HTTP, điều rất quan trọng là phải bảo vệ một Dịch vụ Web RESTful theo cách giống như một trang web được bảo mật.

Sau đây là các phương pháp hay nhất cần tuân thủ khi thiết kế một Dịch vụ Web RESTful -

  • Validation- Xác thực tất cả các đầu vào trên máy chủ. Bảo vệ máy chủ của bạn trước các cuộc tấn công SQL hoặc NoSQL.

  • Session Based Authentication - Sử dụng xác thực dựa trên phiên để xác thực người dùng bất cứ khi nào có yêu cầu đối với phương thức Dịch vụ Web.

  • No Sensitive Data in the URL - Không bao giờ sử dụng tên người dùng, mật khẩu hoặc mã thông báo phiên trong URL, những giá trị này phải được chuyển đến Dịch vụ Web thông qua phương thức POST.

  • Restriction on Method Execution- Cho phép sử dụng hạn chế các phương thức như phương thức GET, POST và DELETE. Phương thức GET sẽ không thể xóa dữ liệu.

  • Validate Malformed XML/JSON - Kiểm tra thông tin đầu vào đúng định dạng được chuyển tới phương thức dịch vụ web.

  • Throw generic Error Messages - Phương thức dịch vụ web nên sử dụng thông báo lỗi HTTP như 403 để hiển thị quyền truy cập bị cấm, v.v.

Mã HTTP

Sr.No. Mã và mô tả HTTP

1

200

OK - cho thấy sự thành công.

2

201

CREATED- khi một tài nguyên được tạo thành công bằng cách sử dụng yêu cầu POST hoặc PUT. Trả về liên kết đến tài nguyên mới được tạo bằng cách sử dụng tiêu đề vị trí.

3

204

NO CONTENT- khi nội dung phản hồi trống. Ví dụ: yêu cầu XÓA.

4

304

NOT MODIFIED- được sử dụng để giảm sử dụng băng thông mạng trong trường hợp yêu cầu GET có điều kiện. Nội dung phản hồi phải trống. Tiêu đề phải có ngày tháng, vị trí, v.v.

5

400

BAD REQUEST- cho biết rằng một đầu vào không hợp lệ được cung cấp. Ví dụ, lỗi xác thực, thiếu dữ liệu.

6

401

UNAUTHORIZED - cho biết rằng người dùng đang sử dụng mã thông báo xác thực không hợp lệ hoặc sai.

7

403

FORBIDDEN- nói rằng người dùng không có quyền truy cập vào phương pháp đang được sử dụng. Ví dụ: Xóa quyền truy cập mà không có quyền quản trị.

số 8

404

NOT FOUND - nói rằng phương pháp này không khả dụng.

9

409

CONFLICT- nêu tình huống xung đột trong khi thực hiện phương thức. Ví dụ, thêm mục nhập trùng lặp.

10

500

INTERNAL SERVER ERROR - nói rằng máy chủ đã ném một số ngoại lệ trong khi thực thi phương thức.

JAX-RSlà viết tắt của JAVA API cho RESTful Web Services. JAX-RS là một đặc tả và API ngôn ngữ lập trình dựa trên JAVA để cung cấp hỗ trợ cho các Dịch vụ Web RESTful đã tạo. Phiên bản 2.0 của nó được phát hành vào ngày 24 tháng 5 năm 2013. JAX-RS sử dụng các chú thích có sẵn từ Java SE 5 để đơn giản hóa việc phát triển tạo và triển khai các dịch vụ web dựa trên JAVA. Nó cũng cung cấp hỗ trợ tạo máy khách cho Dịch vụ Web RESTful.

Thông số kỹ thuật

Sau đây là các chú thích được sử dụng phổ biến nhất để ánh xạ tài nguyên dưới dạng tài nguyên dịch vụ web.

Sr.No. Chú thích & Mô tả

1

@Path

Đường dẫn tương đối của lớp / phương thức tài nguyên.

2

@GET

Yêu cầu HTTP Get, được sử dụng để tìm nạp tài nguyên.

3

@PUT

Yêu cầu HTTP PUT, được sử dụng để cập nhật tài nguyên.

4

@POST

Yêu cầu HTTP POST, được sử dụng để tạo tài nguyên mới.

5

@DELETE

Yêu cầu HTTP DELETE, được sử dụng để xóa tài nguyên.

6

@HEAD

Yêu cầu HTTP HEAD, được sử dụng để nhận trạng thái khả dụng của phương thức.

7

@Produces

Nêu rõ Phản hồi HTTP được tạo bởi dịch vụ web. Ví dụ: APPLICATION / XML, TEXT / HTML, APPLICATION / JSON, v.v.

số 8

@Consumes

Nêu loại Yêu cầu HTTP. Ví dụ: application / x-www-formurlencoded để chấp nhận dữ liệu biểu mẫu trong phần thân HTTP trong khi yêu cầu POST.

9

@PathParam

Liên kết tham số được truyền cho phương thức với một giá trị trong đường dẫn.

10

@QueryParam

Liên kết tham số được truyền cho phương thức với tham số truy vấn trong đường dẫn.

11

@MatrixParam

Liên kết tham số được truyền cho phương thức với tham số ma trận HTTP trong đường dẫn.

12

@HeaderParam

Liên kết tham số được truyền cho phương thức với tiêu đề HTTP.

13

@CookieParam

Liên kết tham số được truyền cho phương thức với Cookie.

14

@FormParam

Liên kết tham số được truyền cho phương thức thành một giá trị biểu mẫu.

15

@DefaultValue

Gán giá trị mặc định cho một tham số được truyền cho phương thức.

16

@Context

Bối cảnh của tài nguyên. Ví dụ: HTTPRequest làm ngữ cảnh.

Note- Chúng tôi đã sử dụng Jersey, một triển khai tham chiếu của JAX-RS 2.0 của Oracle, trong các chương RESTful Web Services - Ứng dụng đầu tiên và RESTful Web Services - Các chương.