Как получить параметры запроса в Spring Boot?


123

Я разрабатываю проект с помощью Spring Boot. У меня есть контроллер, который принимает запросы GET .

В настоящее время я принимаю запросы на следующие типы URL:

http: // локальный: 8888 / пользователь / данные / 002

но я хочу принимать запросы с использованием параметров запроса :

http: // локальный: 8888 / пользователь? данные = 002

Вот код моего контроллера:

@RequestMapping(value="/data/{itemid}", method = RequestMethod.GET)
public @ResponseBody
item getitem(@PathVariable("itemid") String itemid) {   
    item i = itemDao.findOne(itemid);              
    String itemname = i.getItemname();
    String price = i.getPrice();
    return i;
}

7
@RequestParam(хорошая отправная точка: официальное руководство )
kryger

Ответы:


199

Используйте @RequestParam

@RequestMapping(value="user", method = RequestMethod.GET)
public @ResponseBody Item getItem(@RequestParam("data") String itemid){

    Item i = itemDao.findOne(itemid);              
    String itemName = i.getItemName();
    String price = i.getPrice();
    return i;
}

1
тогда каков URL этого метода, подскажите пожалуйста? Что мне нужно изменить
Механди Хассан

извините, братан, этот URL-адрес не работает localhost: 8888 / user? data = 001 Я ввел этот URL-адрес
Механди Хассан

3
Удалите значение = "/" из аннотации сопоставления запроса. Кстати, это действительно плохой дизайн. Если вы собираетесь получить доступ к элементу для пользователя, то оставшимся способом будет user / items / {itemId} .
afraisse

19
Использование @RequestParam как public @ResponseBody item getitem(@RequestParam("data") String itemid){требует, чтобы параметр запроса данных всегда присутствовал. Вместо этого, если вы используете его таким образом public @ResponseBody item getitem(@RequestParam Map<String, String> queryParameters){, он делает данные необязательными
самсри

3
... Я должен был опубликовать ответ вместо того, чтобы оставлять комментарий под вопросом! : -o
kryger

9

Хотя принятый ответ afraisse является абсолютно правильным с точки зрения использования @RequestParam, я бы также предложил использовать Optional <>, поскольку вы не всегда можете гарантировать, что используется правильный параметр. Кроме того, если вам нужен Integer или Long, просто используйте этот тип данных, чтобы избежать приведения типов позже в DAO.

@RequestMapping(value="/data", method = RequestMethod.GET)
public @ResponseBody
Item getItem(@RequestParam("itemid") Optional<Integer> itemid) { 
    if( itemid.isPresent()){
         Item i = itemDao.findOne(itemid.get());              
         return i;
     } else ....
}

откуда вы взяли Optional?
Джои Гоф,


2

В Spring boot: 2.1.6 вы можете использовать, как показано ниже:

    @GetMapping("/orders")
    @ApiOperation(value = "retrieve orders", response = OrderResponse.class, responseContainer = "List")
    public List<OrderResponse> getOrders(
            @RequestParam(value = "creationDateTimeFrom", required = true) String creationDateTimeFrom,
            @RequestParam(value = "creationDateTimeTo", required = true) String creationDateTimeTo,
            @RequestParam(value = "location_id", required = true) String location_id) {

        // TODO...

        return response;

@ApiOperation - это аннотация, которая поступает из Swagger api, она используется для документирования API.


required = trueпо умолчанию
DV82XL

0

Меня это тоже заинтересовало, и я наткнулся на несколько примеров на сайте Spring Boot.

   // get with query string parameters e.g. /system/resource?id="rtze1cd2"&person="sam smith" 
// so below the first query parameter id is the variable and name is the variable
// id is shown below as a RequestParam
    @GetMapping("/system/resource")
    // this is for swagger docs
    @ApiOperation(value = "Get the resource identified by id and person")
    ResponseEntity<?> getSomeResourceWithParameters(@RequestParam String id, @RequestParam("person") String name) {

        InterestingResource resource = getMyInterestingResourc(id, name);
        logger.info("Request to get an id of "+id+" with a name of person: "+name);

        return new ResponseEntity<Object>(resource, HttpStatus.OK);
    }

Смотрите также здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.