Передача нескольких параметров в REST API - Spring
Проблема с передачей 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"}
У меня есть несколько вопросов:
Возможно ли передать JSON-объект в URL, как в Примере 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 ответ(ов)
Да, это возможно. Однако вы не можете передать 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) {
// код здесь
}
В вашем примере кода показано, как можно обрабатывать несколько параметров в методе контроллера 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 {
// Логика обработки запроса
}
@RequestMapping: Это аннотация, которая связывает HTTP-запросы с методами вашего контроллера. В данном случае, путь запроса —
/mno/{objectKey}
, где{objectKey}
является переменной пути.@PathVariable: Эта аннотация используется для извлечения значения переменной пути
objectKey
из URL. Значение будет автоматически передано в параметрobjectKey
вашего метода.@RequestParam: Эти аннотации позволяют вам получать параметры запроса. В примере у вас два параметра:
id
иname
. Вы указалиdefaultValue = "false"
, что означает, если параметры не будут переданы в запросе, то вместоnull
будет использовано значение"false"
.
Таким образом, на ваш GET-запрос по пути /mno/{objectKey}
с опциональными параметрами id
и name
метод getBook
будет вызван, и вы можете использовать переданные значения внутри метода для дальнейшей обработки.
Помимо этого, не забывайте добавлять обработку исключений для более аккуратного управления ошибками внутри метода.
Да, это возможно передать 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-объектов.
Не удается автопровести сервис в HandlerInterceptorAdapter
Как реализовать пагинацию в Spring MVC 3 [закрыто]
Почему поле с @Autowired в Spring оказывается null?
Как преобразовать jsonString в JSONObject в Java?
Закодированный пароль не выглядит как BCrypt