Рубрики
Без рубрики

Параметры JSON с Spring MVC

Узнайте, как отправлять параметры JSON в запросах GET и POST при использовании Spring MVC.

Автор оригинала: Abderrahim Azhrioun.

1. Обзор

В этом коротком уроке мы подробно рассмотрим, как работать с параметрами JSON в Spring MVC.

Во-первых, мы начнем с небольшой предыстории параметров JSON. Затем мы спустимся в кроличью нору, чтобы посмотреть, как отправлять параметры JSON в POST и ПОЛУЧАТЬ запросы.

2. Параметры JSON в Spring MVC

Использование JSON для отправки или получения данных является обычной практикой среди веб-разработчиков. Иерархическая структура строк JSON предлагает более компактный и удобочитаемый способ представления параметров HTTP-запроса.

По умолчанию Spring MVC предоставляет готовую привязку данных для простых типов данных, таких как String . Для этой цели он использует список встроенных редакторов свойств under-the-hood.

Однако в реальных проектах мы можем захотеть связать более сложные типы данных. Например, может оказаться полезным сопоставить параметр JSON с объектом модели.

Однако в реальных проектах мы можем захотеть связать более сложные типы данных. Например, может оказаться полезным сопоставить параметр JSON с объектом модели.

Spring предоставляет простой способ отправки данных JSON с помощью POST-запросов. Встроенная аннотация @RequestBody может автоматически десериализовать данные JSON, инкапсулированные в теле запроса, в конкретный объект модели.

В общем, нам не нужно самостоятельно разбирать тело запроса. Мы можем использовать библиотеку Джексона , чтобы сделать всю тяжелую работу за нас .

Теперь давайте посмотрим, как отправить данные JSON через POST-запрос в Spring MVC.

Во – первых, нам нужно создать объект модели для представления переданных данных JSON. Например, рассмотрим класс Product :

public class Product {

    private int id;
    private String name;
    private double price;

    // default constructor + getters + setters

}

Во-вторых, давайте определим метод Spring handler, который принимает POST-запросы:

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

Как мы видим, аннотирования аргумента product с помощью @RequestBody достаточно для привязки данных JSON, отправленных от клиентов .

Теперь мы можем протестировать наш POST-запрос с помощью cURL:

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

4. Отправьте параметр JSON в GET

Spring MVC предлагает @RequestParam извлекать параметры запроса из GET-запросов. Однако, в отличие от @RequestBody, аннотация @RequestParam поддерживает только простые типы данных, такие как int и String .

Итак, чтобы отправить JSON, нам нужно определить наш параметр JSON как простую строку.

Большой вопрос здесь заключается в следующем: как мы преобразуем наш параметр JSON (который является String ) в объект класса Product ?

Ответ довольно прост! Класс ObjectMapper , предоставляемый библиотекой Jackson, предлагает гибкий способ преобразования строк JSON в объекты Java .

Теперь давайте посмотрим, как отправить параметр JSON через GET-запрос в Spring MVC. Во-первых, нам нужно будет создать еще один метод обработчика в нашем контроллере для обработки запросов GET:

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

Как показано выше, метод readValue() позволяет десериализовать параметр JSON product непосредственно в экземпляр класса Product .

Обратите внимание, что мы определяем наш параметр запроса JSON как объект String . Теперь, что делать, если мы хотим передать объект Product , как мы это делали при использовании @RequestBody ?

Чтобы ответить на этот вопрос, Spring предоставляет краткое и гибкое решение с помощью пользовательских редакторов свойств .

Во-первых, нам нужно создать пользовательский редактор свойств, чтобы инкапсулировать логику преобразования параметра JSON, заданного как String , в Product object :

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);
        }
    }

}

Далее, давайте свяжем параметр JSON с объектом класса Product :

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

Наконец, нам нужно добавить последний недостающий кусочек головоломки. Давайте зарегистрируем Редактор продукта в нашем весеннем контроллере :

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

Имейте в виду, что нам нужно URL-кодировать параметр JSON, чтобы обеспечить безопасную транспортировку .

Итак, вместо:

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

Нам нужно отправить:

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. Заключение

Подводя итог, мы увидели, как работать с JSON в Spring MVC. Попутно мы показали, как отправлять параметры JSON в POST и ПОЛУЧАТЬ запросы.

Как всегда, полный исходный код примеров доступен на GitHub .