Spring Boot - Xây dựng các dịch vụ web RESTful
Spring Boot hỗ trợ rất tốt cho việc xây dựng RESTful Web Services cho các ứng dụng doanh nghiệp. Chương này sẽ giải thích chi tiết về cách xây dựng các dịch vụ web RESTful bằng Spring Boot.
Note - Để xây dựng một RESTful Web Services, chúng ta cần thêm phần phụ thuộc Spring Boot Starter Web vào tệp cấu hình xây dựng.
Nếu bạn là người dùng Maven, hãy sử dụng mã sau để thêm phần phụ thuộc bên dưới vào pom.xml tập tin -
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Nếu bạn là người dùng Gradle, hãy sử dụng mã sau để thêm phần phụ thuộc bên dưới vào build.gradle tập tin.
compile('org.springframework.boot:spring-boot-starter-web')
Mã cho tệp cấu hình bản dựng hoàn chỉnh Maven build – pom.xml được đưa ra dưới đây -
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Mã cho tệp cấu hình bản dựng hoàn chỉnh Gradle Build – build.gradle được đưa ra dưới đây -
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Trước khi bạn tiến hành xây dựng một dịch vụ web RESTful, bạn nên có kiến thức về các chú thích sau:
Bộ điều khiển phần còn lại
Chú thích @RestController được sử dụng để xác định các dịch vụ web RESTful. Nó phục vụ JSON, XML và phản hồi tùy chỉnh. Cú pháp của nó được hiển thị bên dưới:
@RestController
public class ProductServiceController {
}
Yêu cầu ánh xạ
Chú thích @RequestMapping được sử dụng để xác định URI yêu cầu để truy cập Điểm cuối REST. Chúng ta có thể định nghĩa phương thức Request để tiêu thụ và sản xuất đối tượng. Phương thức yêu cầu mặc định là GET.
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProducts() { }
Nội dung yêu cầu
Chú thích @RequestBody được sử dụng để xác định loại nội dung thân yêu cầu.
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}
Biến đường dẫn
Chú thích @PathVariable được sử dụng để xác định URI yêu cầu tùy chỉnh hoặc động. Biến Path trong URI yêu cầu được định nghĩa là dấu ngoặc nhọn {} như được hiển thị bên dưới:
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}
Yêu cầu tham số
Chú thích @RequestParam được sử dụng để đọc các tham số yêu cầu từ URL yêu cầu. Theo mặc định, nó là một tham số bắt buộc. Chúng tôi cũng có thể đặt giá trị mặc định cho các tham số yêu cầu như được hiển thị ở đây -
public ResponseEntity<Object> getProduct(
@RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}
GET API
Phương thức yêu cầu HTTP mặc định là GET. Phương pháp này không yêu cầu bất kỳ Cơ quan Yêu cầu nào. Bạn có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Mã mẫu để xác định phương thức yêu cầu HTTP GET được hiển thị bên dưới. Trong ví dụ này, chúng tôi đã sử dụng HashMap để lưu trữ Sản phẩm. Lưu ý rằng chúng tôi đã sử dụng lớp POJO làm sản phẩm được lưu trữ.
Đây, URI yêu cầu là /productsvà nó sẽ trả về danh sách các sản phẩm từ kho lưu trữ HashMap. Tệp lớp bộ điều khiển được cung cấp bên dưới có chứa Điểm cuối REST của phương thức GET.
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
static {
Product honey = new Product();
honey.setId("1");
honey.setName("Honey");
productRepo.put(honey.getId(), honey);
Product almond = new Product();
almond.setId("2");
almond.setName("Almond");
productRepo.put(almond.getId(), almond);
}
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProduct() {
return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
}
}
API ĐĂNG
Yêu cầu HTTP POST được sử dụng để tạo tài nguyên. Phương thức này chứa phần thân yêu cầu. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ sau đây cho thấy mã mẫu để xác định phương thức yêu cầu HTTP POST. Trong ví dụ này, chúng tôi đã sử dụng HashMap để lưu trữ Sản phẩm, nơi sản phẩm là một lớp POJO.
Đây, URI yêu cầu là /productsvà nó sẽ trả về Chuỗi sau khi lưu trữ sản phẩm vào kho lưu trữ HashMap.
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
@RequestMapping(value = "/products", method = RequestMethod.POST)
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
productRepo.put(product.getId(), product);
return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
}
}
API PUT
Yêu cầu HTTP PUT được sử dụng để cập nhật tài nguyên hiện có. Phương thức này chứa một phần thân yêu cầu. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ dưới đây cho thấy cách xác định phương thức yêu cầu HTTP PUT. Trong ví dụ này, chúng tôi đã sử dụng HashMap để cập nhật Sản phẩm hiện có, trong đó sản phẩm là một lớp POJO.
Đây là URI yêu cầu /products/{id}sẽ trả về Chuỗi sau sản phẩm vào kho lưu trữ HashMap. Lưu ý rằng chúng tôi đã sử dụng biến Path{id} xác định ID sản phẩm cần được cập nhật.
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
productRepo.remove(id);
product.setId(id);
productRepo.put(id, product);
return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
}
}
XÓA API
Yêu cầu Xóa HTTP được sử dụng để xóa tài nguyên hiện có. Phương thức này không chứa bất kỳ Nội dung Yêu cầu nào. Chúng tôi có thể gửi tham số yêu cầu và biến đường dẫn để xác định URL tùy chỉnh hoặc URL động.
Ví dụ dưới đây cho thấy cách xác định phương thức yêu cầu HTTP DELETE. Trong ví dụ này, chúng tôi đã sử dụng HashMap để xóa sản phẩm hiện có, là một lớp POJO.
URI yêu cầu là /products/{id}và nó sẽ trả về Chuỗi sau khi xóa sản phẩm khỏi kho lưu trữ HashMap. Chúng tôi đã sử dụng biến Path{id} xác định ID sản phẩm cần được xóa.
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
@RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Object> delete(@PathVariable("id") String id) {
productRepo.remove(id);
return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
}
}
Phần này cung cấp cho bạn bộ mã nguồn hoàn chỉnh. Quan sát các mã sau để biết các chức năng tương ứng của chúng:
The Spring Boot main application class – DemoApplication.java
package com.tutorialspoint.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
The POJO class – Product.java
package com.tutorialspoint.demo.model;
public class Product {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
The Rest Controller class – ProductServiceController.java
package com.tutorialspoint.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.model.Product;
@RestController
public class ProductServiceController {
private static Map<String, Product> productRepo = new HashMap<>();
static {
Product honey = new Product();
honey.setId("1");
honey.setName("Honey");
productRepo.put(honey.getId(), honey);
Product almond = new Product();
almond.setId("2");
almond.setName("Almond");
productRepo.put(almond.getId(), almond);
}
@RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Object> delete(@PathVariable("id") String id) {
productRepo.remove(id);
return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
}
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) {
productRepo.remove(id);
product.setId(id);
productRepo.put(id, product);
return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
}
@RequestMapping(value = "/products", method = RequestMethod.POST)
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
productRepo.put(product.getId(), product);
return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
}
@RequestMapping(value = "/products")
public ResponseEntity<Object> getProduct() {
return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
}
}
Bạn có thể tạo tệp JAR có thể thực thi và chạy ứng dụng khởi động mùa xuân bằng cách sử dụng lệnh Maven hoặc Gradle bên dưới như được hiển thị:
Đối với Maven, hãy sử dụng lệnh hiển thị bên dưới:
mvn clean install
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục đích.
Đối với Gradle, hãy sử dụng lệnh được hiển thị bên dưới:
gradle clean build
Sau khi “XÂY DỰNG THÀNH CÔNG”, bạn có thể tìm thấy tệp JAR trong thư mục build / libs.
Bạn có thể chạy tệp JAR bằng cách sử dụng lệnh hiển thị bên dưới:
java –jar <JARFILE>
Thao tác này sẽ khởi động ứng dụng trên cổng Tomcat 8080 như hình dưới đây -
Bây giờ, hãy nhấn vào URL hiển thị bên dưới trong ứng dụng POSTMAN và xem kết quả.
URL GET API là: http://localhost:8080/products
URL POST API là: http://localhost:8080/products
URL của PUT API là: http://localhost:8080/products/3
URL của API DELETE là: http://localhost:8080/products/3