如何在 Spring Boot 控制器中检索查询参数?

问题描述 投票:0回答:7

我正在使用 Spring Boot 开发一个项目。我有一个接受 GET 请求的控制器。

目前我接受对以下类型 URL 的请求:

http://localhost:8888/user/data/002

但我想使用 查询参数接受请求:

http://localhost:8888/user?data=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;
}
java spring-boot rest spring-mvc
7个回答
306
投票

使用@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;
}

34
投票

虽然 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 ....
}

19
投票

要在同一

@PathVariable
端点中接受
@RequestParam
/user

@GetMapping(path = {"/user", "/user/{data}"})
public void user(@PathVariable(required=false,name="data") String data,
                 @RequestParam(required=false) Map<String,String> qparams) {
    qparams.forEach((a,b) -> {
        System.out.println(String.format("%s -> %s",a,b));
    }
  
    if (data != null) {
        System.out.println(data);
    }
}

使用卷曲测试:

  • curl 'http://localhost:8080/user/books'
  • curl 'http://localhost:8080/user?book=ofdreams&name=nietzsche'

8
投票

要在同一端点中接受路径变量和查询参数:

@RequestMapping(value = "/hello/{name}", method = RequestMethod.POST)
    public String sayHi(
            @PathVariable("name") String name, 
            @RequestBody Topic topic,
            //@RequestParam(required = false, name = "s") String s, 
            @RequestParam Map<String, String> req) {
        
        return "Hi "+name +" Topic : "+ topic+" RequestParams : "+req;
    }

URL 看起来像:http://localhost:8080/hello/testUser?city=Pune&Pin=411058&state=Maha


5
投票

在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。


4
投票

我对此也很感兴趣,并在 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);
    }

另请参阅这里


0
投票

使用@GetMapping注解时,通常在请求中使用@RequestParam而不是@RequestBody。如果你想使用@RequestBody,你应该在API方法中使用@PostMapping注解。

© www.soinside.com 2019 - 2024. All rights reserved.