0

Передача нескольких параметров в REST API - Spring

11

Проблема с передачей JSON-объекта и параметров в REST API на Spring

Я пытаюсь разобраться, возможно ли передать JSON-объект в REST API или передать несколько параметров в этот API? Как читать эти параметры в Spring? Предположим, что URL выглядит следующим образом:

Пример 1:

http://localhost:8080/api/v1/mno/objectKey?id=1&name=saif

Вопрос: допустимо ли передавать JSON-объект, как в примере ниже?

Пример 2:

http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}

У меня есть несколько вопросов:

  1. Возможно ли передать JSON-объект в URL, как в Примере 2?

  2. Как мы можем передать и разобрать параметры в Примере 1?

Я пытался написать методы для достижения своей цели, но не смог найти правильное решение.

Я пытался передать JSON-объект с помощью @RequestParam.

При запросе

http://localhost:8080/api/v1/mno/objectKey?id=1

я получил неожиданную ошибку:

(type=Unsupported Media Type, status=415). Content type 'null' not supported

При запросе

http://localhost:8080/api/v1/mno/objectKey/id=1

я столкнулся с другой ошибкой:

(type=Not Found, status=404). No message available

Попытка передать JSON-объект в URL, кодировав его, как в запросе:

http://localhost:8080/api/v1/mno/objectKey/%7B%22id%22:1%7D

также привела к ошибке:

(type=Not Found, status=404). No message available

Я пробовал следующий код для передачи через @RequestParam:

@RequestMapping(value="mno/{objectKey}",
                method = RequestMethod.GET, 
                consumes="application/json")
public List<Book> getBook4(@RequestParam ObjectKey objectKey) {
    ...
}

И также пробовал код с использованием @PathVariable:

@RequestMapping(value="ghi/{objectKey}", method = RequestMethod.GET)
public List<Book> getBook2(@PathVariable ObjectKey objectKey) {
    ...         
}

Я создал этот класс, чтобы хранить параметры, такие как id и другие параметры, например, имя:

class ObjectKey {
    long id;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
}

Надеюсь на помощь сообщества!

3 ответ(ов)

1

Да, это возможно. Однако вы не можете передать JSON-объект в URL, как в примере (http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}), потому что это невалидный URL.

Если вы хотите сделать это по RESTful принципам, используйте следующий формат: http://localhost:8080/api/v1/mno/objectKey/1/Saif, и определите ваш метод так:

@RequestMapping(path = "/mno/objectKey/{id}/{name}", method = RequestMethod.GET)
public Book getBook(@PathVariable int id, @PathVariable String name) {
    // код здесь
}

Что касается второго вопроса о том, как передать и разобрать параметры в примере 1, просто добавьте два параметра запроса и укажите правильный путь:

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.GET)
public Book getBook(@RequestParam int id, @RequestParam String name) {
    // код здесь
}

Обновление (из комментария)

Если у вас есть сложная структура параметров, например:

"A": [ {
    "B": 37181,
    "timestamp": 1160100436,
    "categories": [ {
        "categoryID": 2653,
        "timestamp": 1158555774
    }, {
        "categoryID": 4453,
        "timestamp": 1158555774
    } ]
} ]

Отправьте это как POST с JSON-данными в теле запроса, а не в URL, и укажите тип контента как application/json.

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.POST, consumes = "application/json")
public Book getBook(@RequestBody ObjectKey objectKey) {
    // код здесь
}
0

В вашем примере кода показано, как можно обрабатывать несколько параметров в методе контроллера Spring. Давайте разберем это более подробно:

@RequestMapping(value = "/mno/{objectKey}", method = RequestMethod.GET, produces = "application/json")
public List<String> getBook(HttpServletRequest httpServletRequest, 
                             @PathVariable(name = "objectKey") String objectKey,
                             @RequestParam(value = "id", defaultValue = "false") String id,
                             @RequestParam(value = "name", defaultValue = "false") String name) throws Exception {
    // Логика обработки запроса
}
  1. @RequestMapping: Это аннотация, которая связывает HTTP-запросы с методами вашего контроллера. В данном случае, путь запроса — /mno/{objectKey}, где {objectKey} является переменной пути.

  2. @PathVariable: Эта аннотация используется для извлечения значения переменной пути objectKey из URL. Значение будет автоматически передано в параметр objectKey вашего метода.

  3. @RequestParam: Эти аннотации позволяют вам получать параметры запроса. В примере у вас два параметра: id и name. Вы указали defaultValue = "false", что означает, если параметры не будут переданы в запросе, то вместо null будет использовано значение "false".

Таким образом, на ваш GET-запрос по пути /mno/{objectKey} с опциональными параметрами id и name метод getBook будет вызван, и вы можете использовать переданные значения внутри метода для дальнейшей обработки.

Помимо этого, не забывайте добавлять обработку исключений для более аккуратного управления ошибками внутри метода.

0

Да, это возможно передать JSON-объект в URL. Вот пример, как это можно сделать:

String queryString = "{\"left\":\"" + params.get("left") + "\"}"; // Не забудьте закрыть кавычку в строке
httpRestTemplate.exchange(
    Endpoint + "/A/B?query={queryString}",
    HttpMethod.GET,
    entity,
    z.class,
    queryString
);

В данном примере мы создаем JSON-строку и используем ее в качестве параметра запроса в методе exchange. Убедитесь, что строка корректно экранирована, чтобы избежать проблем с форматированием. Также обратите внимание, что параметры URL могут иметь ограничения по размеру, так что стоит быть осторожным при передаче больших JSON-объектов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь