Tham số JSON với Spring MVC

1. Khái quát chung

Trong hướng dẫn ngắn này, chúng ta sẽ xem xét kỹ cách làm việc với các tham số JSON trong Spring MVC.

Đầu tiên, chúng ta sẽ bắt đầu với một chút thông tin cơ bản về các tham số JSON. Sau đó, chúng ta sẽ đi xuống lỗ thỏ để xem cách gửi các tham số JSON trong các yêu cầu POST và GET.

2. Tham số JSON trong Spring MVC

Sử dụng JSON để gửi hoặc nhận dữ liệu là một thực tế phổ biến giữa các nhà phát triển web. Cấu trúc phân cấp của các chuỗi JSON cung cấp một cách nhỏ gọn hơn và con người có thể đọc được để biểu diễn các tham số yêu cầu HTTP.

Theo mặc định, Spring MVC cung cấp liên kết dữ liệu ngoài hộp cho các kiểu dữ liệu đơn giản như Chuỗi . Với mục đích đó, nó sử dụng một danh sách các trình chỉnh sửa thuộc tính được tích hợp sẵn bên dưới.

Tuy nhiên, trong các dự án thế giới thực, chúng ta có thể muốn ràng buộc các kiểu dữ liệu phức tạp hơn. Ví dụ: có thể hữu ích khi có thể ánh xạ một tham số JSON vào một đối tượng mô hình.

3. Gửi dữ liệu JSON trong POST

Spring cung cấp một cách đơn giản để gửi dữ liệu JSON qua các yêu cầu POST. Việc xây dựng trong @RequestBody chú thích có thể tự động deserialize dữ liệu JSON gói gọn trong cơ thể yêu cầu vào một đối tượng mô hình cụ thể.

Nói chung, chúng tôi không phải tự phân tích cú pháp phần thân yêu cầu. Chúng tôi có thể sử dụng thư viện Jackson để thực hiện tất cả các công việc nặng nhọc cho chúng tôi .

Bây giờ, hãy xem cách gửi dữ liệu JSON qua yêu cầu POST trong Spring MVC.

Đầu tiên, chúng ta cần tạo một đối tượng mô hình để đại diện cho dữ liệu JSON được truyền vào. Ví dụ: hãy xem xét lớp Sản phẩm :

public class Product { private int id; private String name; private double price; // default constructor + getters + setters }

Thứ hai, hãy xác định một phương thức xử lý Spring chấp nhận các yêu cầu POST:

@PostMapping("/create") @ResponseBody public Product createProduct(@RequestBody Product product) { // custom logic return product; }

Như chúng ta có thể thấy, chú thích đối số sản phẩm với @RequestBody là đủ để ràng buộc dữ liệu JSON được gửi từ các máy khách .

Bây giờ, chúng tôi có thể kiểm tra yêu cầu ĐĂNG của mình bằng cURL:

curl -i \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -X POST --data \ '{"id": 1,"name": "Asus Zenbook","price": 800}' "//localhost:8080/spring-mvc-basics-4/products/create"

4. Gửi thông số JSON trong GET

Spring MVC cung cấp @RequestParam để trích xuất các tham số truy vấn từ các yêu cầu GET. Tuy nhiên, không giống như @RequestBody, các @RequestParam hỗ trợ chú thích chỉ đơn giản kiểu dữ liệu như intchuỗi .

Vì vậy, để gửi JSON, chúng ta sẽ cần xác định tham số JSON của mình dưới dạng một chuỗi đơn giản.

Câu hỏi lớn ở đây là: Làm thế nào để chúng ta chuyển đổi tham số JSON (là một Chuỗi ) thành một đối tượng của lớp Sản phẩm ?

Câu trả lời là khá đơn giản! Lớp ObjectMapper do thư viện Jackson cung cấp cung cấp một cách linh hoạt để chuyển đổi các chuỗi JSON thành các đối tượng Java .

Bây giờ, hãy xem cách gửi một tham số JSON qua một yêu cầu GET trong Spring MVC. Trước tiên, chúng ta sẽ cần tạo một phương thức xử lý khác trong bộ điều khiển của mình để xử lý các yêu cầu GET:

@GetMapping("/get") @ResponseBody public Product getProduct(@RequestParam String product) throws JsonMappingException, JsonProcessingException { Product prod = objectMapper.readValue(product, Product.class); return prod; }

Như được hiển thị ở trên, phương thức readValue () cho phép giải mã sản phẩm tham số JSON trực tiếp vào một thể hiện của lớp Sản phẩm .

Lưu ý rằng chúng tôi xác định tham số truy vấn JSON của chúng tôi dưới dạng đối tượng Chuỗi . Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn truyền một đối tượng Sản phẩm như chúng ta đã làm khi sử dụng @RequestBody ?

Để trả lời câu hỏi này, Spring cung cấp một giải pháp ngắn gọn và linh hoạt thông qua trình chỉnh sửa thuộc tính tùy chỉnh.

Trước tiên, chúng ta sẽ cần tạo một trình chỉnh sửa thuộc tính tùy chỉnh để đóng gói logic chuyển đổi thông số JSON được cung cấp dưới dạng Chuỗi thành đối tượng Sản phẩm :

public class ProductEditor extends PropertyEditorSupport { private ObjectMapper objectMapper; public ProductEditor(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { setValue(null); } else { Product prod = new Product(); try { prod = objectMapper.readValue(text, Product.class); } catch (JsonProcessingException e) { throw new IllegalArgumentException(e); } setValue(prod); } } }

Tiếp theo, hãy liên kết tham số JSON với một đối tượng của lớp Sản phẩm :

@GetMapping("/get2") @ResponseBody public Product get2Product(@RequestParam Product product) { // custom logic return product; }

Cuối cùng, chúng ta cần thêm mảnh ghép còn thiếu cuối cùng. Hãy đăng ký ProductEditor trong bộ điều khiển Spring của chúng tôi :

@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Product.class, new ProductEditor(objectMapper)); }

Lưu ý rằng chúng tôi cần mã hóa URL tham số JSON để đảm bảo truyền tải an toàn .

Vì vậy, thay vì:

GET /spring-mvc-basics-4/products/get2?product={"id": 1,"name": "Asus Zenbook","price": 800}

Chúng tôi cần gửi:

GET /spring-mvc-basics-4/products/get2?product=%7B%22id%22%3A%201%2C%22name%22%3A%20%22Asus%20Zenbook%22%2C%22price%22%3A%20800%7D

5. Kết luận

Tóm lại, chúng ta đã biết cách làm việc với JSON trong Spring MVC. Trong quá trình thực hiện, chúng tôi đã giới thiệu cách gửi các tham số JSON trong các yêu cầu POST và GET.

Như mọi khi, mã nguồn đầy đủ của các ví dụ có sẵn trên GitHub.