Comment récupérer les paramètres de requête dans Spring Boot?

122

Je développe un projet avec Spring Boot. J'ai un contrôleur qui accepte les requêtes GET .

Actuellement, j'accepte les demandes adressées aux types d'URL suivants:

http: // localhost: 8888 / utilisateur / data / 002

mais je souhaite accepter les demandes utilisant des paramètres de requête :

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

Voici le code de mon contrôleur:

@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;
}
Mehandi Hassan
la source
7
@RequestParam(bon point de départ: le guide officiel )
kryger

Réponses:

197

Utilisez @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;
}
afraisse
la source
1
alors quelle est l'URL de cette méthode pouvez-vous s'il vous plaît dire? Que dois-je changer
Mehandi Hassan
Désolé, cette URL ne fonctionne pas localhost: 8888 / user? data = 001 J'ai saisi cette URL
Mehandi Hassan
3
Supprimez value = "/" de l'annotation de mappage de demande. Btw c'est vraiment une mauvaise conception. Si vous allez accéder à un élément pour un utilisateur, le reste serait user / items / {itemId} .
afraisse
18
L'utilisation de @RequestParam as public @ResponseBody item getitem(@RequestParam("data") String itemid){nécessite que le paramètre de requête de données soit toujours présent. Au lieu de cela, si vous l'utilisez de cette façon public @ResponseBody item getitem(@RequestParam Map<String, String> queryParameters){, cela rend les données facultatives
samsri
3
... J'aurais dû poster une réponse au lieu de laisser un commentaire sous la question! : -o
kryger
9

Bien que la réponse acceptée par afraisse soit absolument correcte en termes d'utilisation @RequestParam, je suggérerais en outre d'utiliser un option <> car vous ne pouvez pas toujours vous assurer que le bon paramètre est utilisé. De plus, si vous avez besoin d'un Integer ou d'un Long, utilisez simplement ce type de données pour éviter de transtyper les types ultérieurement dans le 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 ....
}
Andrew Grothe
la source
d'où avez-vous obtenu facultatif?
Joey Gough le
1
@JoeyGough introduit dans Java 8. docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Andrew Grothe le
2

Dans Spring boot: 2.1.6, vous pouvez utiliser comme ci-dessous:

    @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 est une annotation qui vient de Swagger api, elle est utilisée pour documenter les apis.

Shashank
la source
required = truepar défaut
DV82XL
0

Cela m'intéressait également et je suis tombé sur quelques exemples sur le site 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);
    }

Voir aussi ici

TKPhillyBurb
la source