ฉันจะดึงข้อมูลพารามิเตอร์การสืบค้นใน Spring Boot ได้อย่างไร


123

ฉันกำลังพัฒนาโครงการโดยใช้ Spring Boot ฉันเป็นผู้ควบคุมที่รับคำขอGET

ขณะนี้ฉันยอมรับคำขอประเภท URL ต่อไปนี้:

http: // localhost: 8888 / ผู้ใช้ / ข้อมูล / 002

แต่ฉันต้องการยอมรับคำขอโดยใช้พารามิเตอร์การค้นหา :

http: // localhost: 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 ของวิธีนี้ช่วยบอกอะไรได้บ้าง? ฉันควรเปลี่ยนอะไรบ้าง
Mehandi Hassan

ขออภัย URL นี้ไม่ทำงาน localhost: 8888 / user? data = 001 ฉันได้ป้อน URL นี้แล้ว
Mehandi Hassan

3
ลบค่า = "/"ออกจากคำอธิบายประกอบการแมปคำขอ Btw นี่เป็นการออกแบบที่แย่จริงๆ หากคุณกำลังจะเข้าถึงรายการสำหรับผู้ใช้แล้ววิธีที่ส่วนที่เหลือจะเป็นผู้ใช้ / รายการ / {}
afraisse

18
การใช้@RequestParamตามที่public @ResponseBody item getitem(@RequestParam("data") String itemid){ต้องการพารามิเตอร์เคียวรีข้อมูลเพื่อแสดงอยู่เสมอ แต่ถ้าคุณใช้วิธีนี้public @ResponseBody item getitem(@RequestParam Map<String, String> queryParameters){จะทำให้ข้อมูลเป็นทางเลือก
samsri

3
... ฉันควรจะโพสต์คำตอบแทนที่จะแสดงความคิดเห็นไว้ใต้คำถาม! : -o
kryger

9

แม้ว่าคำตอบที่ยอมรับโดย afraisse จะถูกต้องในแง่ของการใช้งาน@RequestParamแต่ฉันขอแนะนำให้ใช้ตัวเลือก <> เพิ่มเติมเนื่องจากคุณไม่สามารถมั่นใจได้ว่าจะใช้พารามิเตอร์ที่ถูกต้องเสมอไป นอกจากนี้หากคุณต้องการจำนวนเต็มหรือแบบยาวเพียงแค่ใช้ประเภทข้อมูลนั้นเพื่อหลีกเลี่ยงการแคสต์ประเภทในภายหลังใน 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 ....
}

คุณได้ตัวเลือกจากที่ไหน
Joey Gough

1
@JoeyGough เปิดตัวใน Java 8. docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Andrew Grothe

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 ซึ่งใช้สำหรับจัดทำเอกสาร apis


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

ดูที่นี่ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.