Wie rufe ich Abfrageparameter in einem Spring Boot-Controller ab?

Lesezeit: 4 Minuten

Benutzer-Avatar
Mehandi Hassan

Ich entwickle ein Projekt mit Spring Boot. Ich habe einen Controller, der akzeptiert ERHALTEN Anfragen.

Derzeit akzeptiere ich Anfragen an die folgenden Arten von URLs:

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

aber ich möchte Anfragen mit akzeptieren Abfrageparameter:

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

Hier der Code meines Controllers:

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

Benutzer-Avatar
afraisse

Verwenden @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;
}

  • Was ist dann die URL dieser Methode, können Sie mir bitte sagen? Was muss ich ändern

    – Mehandi Hassan

    28. August 2015 um 4:57 Uhr

  • Entschuldigung, Bruder, diese URL funktioniert nicht localhost:8888/user?data=001 Ich habe diese URL eingegeben

    – Mehandi Hassan

    28. August 2015 um 5:54 Uhr

  • Entfernen Wert=”/” aus der Request-Mapping-Anmerkung. Übrigens ist das wirklich schlechtes Design. Wenn Sie auf ein Element für einen Benutzer zugreifen, wäre der Rest der Weg user/items/{itemId}.

    – afraisse

    28. August 2015 um 6:10 Uhr


  • Verwenden @RequestParam wie public @ResponseBody item getitem(@RequestParam("data") String itemid){ erfordert Daten Abfrageparameter immer vorhanden sein. Stattdessen, wenn Sie es auf diese Weise verwenden public @ResponseBody item getitem(@RequestParam Map<String, String> queryParameters){ es macht Daten optional sein

    – Samsri

    19. Januar 2018 um 9:13 Uhr

  • @SampathSurineni sollte es sein Map<String, String[]> queryParameters stattdessen.

    – Abfahrtski

    11. Oktober 2018 um 19:17 Uhr


Benutzer-Avatar
Andreas Grothe

Während die akzeptierte Antwort von afraisse in Bezug auf die Verwendung absolut korrekt ist @RequestParam, würde ich außerdem vorschlagen, ein Optional<> zu verwenden, da Sie nicht immer sicherstellen können, dass der richtige Parameter verwendet wird. Wenn Sie eine Ganzzahl oder einen Long-Wert benötigen, verwenden Sie einfach diesen Datentyp, um später im DAO Umwandlungstypen zu vermeiden.

@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 ....
}

  • woher hast du optional?

    – Joey Gough

    7. Februar 2020 um 11:53 Uhr

  • @JoeyGough eingeführt in Java 8. docs.oracle.com/javase/8/docs/api/java/util/Optional.html

    – Andreas Grothe

    7. Februar 2020 um 16:55 Uhr

  • Es ist eine schlechte Idee, Optional in Parameter zu setzen. Verwenden Sie in Parametern nicht Optional. Für dieses Problem können Sie required = false verwenden.

    – schlank

    4. September 2020 um 10:54 Uhr


  • @slim warum ist es eine schlechte idee optional zu verwenden?

    – hemanth5636

    1. Mai 2021 um 15:13 Uhr

  • @hemanth5636, weil Sie 3 mögliche Werte haben können und nicht 2 … (rules.sonarsource.com/java/RSPEC-3553)

    – schlank

    3. Mai 2021 um 7:58 Uhr

Beides zu akzeptieren @PathVariable und @RequestParam im gleichen /user Endpunkt:

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

Testen mit Curl:

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

  • Was ist, wenn Sie Negative weitergeben möchten, wie z &name!=nietzsche ?

    – ansh sachdeva

    15. Oktober 2021 um 10:11 Uhr

  • Sie können einfach einen anderen Anfrageparameter einführen und den unerwünschten Namen dort einfügen 🙂

    – Ismail Yavuz

    14. Juli um 12:56 Uhr

In Spring Boot: 2.1.6 können Sie wie folgt verwenden:

    @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 ist eine Anmerkung, die von der Swagger-API stammt. Sie wird zum Dokumentieren der APIs verwendet.

So akzeptieren Sie sowohl die Pfadvariable als auch den Abfrageparameter im selben Endpunkt:

@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 sieht so aus: http://localhost:8080/hello/testUser?city=Pune&Pin=411058&state=Maha

Benutzer-Avatar
TKPhillyBurb

Das hat mich auch interessiert und ich bin auf der Spring Boot Seite auf einige Beispiele gestoßen.

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

Siehe auch hier

1349890cookie-checkWie rufe ich Abfrageparameter in einem Spring Boot-Controller ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy