1. Übersicht
In diesem kurzen Tutorial werden wir die @ RequestParam- Annotation von Spring und ihre Attribute untersuchen.
Einfach ausgedrückt, können wir @RequestParam verwenden , um Abfrageparameter, Formularparameter und sogar Dateien aus der Anfrage zu extrahieren.
2. Eine einfache Zuordnung
Angenommen , wir haben einen Endpunkt / api / foos , der einen Abfrageparameter namens id verwendet :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam String id) { return "ID: " + id; }
In diesem Beispiel haben wir @RequestParam verwendet , um den ID- Abfrageparameter zu extrahieren .
Eine einfache GET-Anfrage würde getFoos aufrufen :
//localhost:8080/api/foos?id=abc ---- ID: abc
Schauen wir uns als Nächstes die Attribute der Anmerkung an: Name , Wert , Erforderlich und Standardwert .
3. Angeben des Anforderungsparameternamens
Im vorherigen Beispiel sind sowohl der Variablenname als auch der Parametername identisch.
Manchmal möchten wir jedoch, dass diese anders sind. Wenn wir Spring Boot nicht verwenden, müssen wir möglicherweise eine spezielle Konfiguration zur Kompilierungszeit vornehmen, oder die Parameternamen befinden sich nicht im Bytecode.
Glücklicherweise können wir die Konfiguration @RequestParam Namen mit dem Namen Attribute :
@PostMapping("/api/foos") @ResponseBody public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { return "ID: " + fooId + " Name: " + name; }
Wir können auch @RequestParam (Wert = "id") oder nur @RequestParam ("id") ausführen.
4. Optionale Anforderungsparameter
Mit @RequestParam kommentierte Methodenparameter sind standardmäßig erforderlich.
Dies bedeutet, dass, wenn der Parameter in der Anforderung nicht vorhanden ist, eine Fehlermeldung angezeigt wird:
GET /api/foos HTTP/1.1 ----- 400 Bad Request Required String parameter 'id' is not present
Wir können unser @RequestParam so konfigurieren , dass es optional ist, mit dem erforderlichen Attribut:
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(required = false) String id) { return "ID: " + id; }
In diesem Fall beide:
//localhost:8080/api/foos?id=abc ---- ID: abc
und
//localhost:8080/api/foos ---- ID: null
ruft die Methode korrekt auf.
Wenn der Parameter nicht angegeben wird, ist der Methodenparameter an null gebunden .
4.1. Verwenden von Java 8 Optional
Alternativ können wir den Parameter in Optional umschließen :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam Optional id){ return "ID: " + id.orElseGet(() -> "not provided"); }
In diesem Fall müssen wir das erforderliche Attribut nicht angeben .
Der Standardwert wird verwendet, wenn der Anforderungsparameter nicht angegeben wird:
//localhost:8080/api/foos ---- ID: not provided
5. Ein Standardwert für den Anforderungsparameter
Wir können auch einen Standardwert für @RequestParam festlegen, indem wir das Attribut defaultValue verwenden :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(defaultValue = "test") String id) { return "ID: " + id; }
Dies ist wie erforderlich = falsch, da der Benutzer den Parameter nicht mehr angeben muss :
//localhost:8080/api/foos ---- ID: test
Obwohl wir immer noch in Ordnung sind, es bereitzustellen:
//localhost:8080/api/foos?id=abc ---- ID: abc
Beachten Sie, dass , wenn wir das Set default Attribut, erforderlich in der Tat zu setzen ist falsch .
6. Alle Parameter zuordnen
Wir können auch mehrere Parameter haben, ohne deren Namen oder Anzahl zu definieren, indem wir nur eine Karte verwenden :
@PostMapping("/api/foos") @ResponseBody public String updateFoos(@RequestParam Map allParams) { return "Parameters are " + allParams.entrySet(); }
Dies spiegelt dann alle gesendeten Parameter wider:
curl -X POST -F 'name=abc' -F 'id=123' //localhost:8080/api/foos ----- Parameters are {[name=abc], [id=123]}
7. Zuordnen eines mehrwertigen Parameters
Ein einzelnes @RequestParam kann mehrere Werte haben:
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam List id) { return "IDs are " + id; }
Und Spring MVC ordnet einen durch Kommas getrennten ID- Parameter zu :
//localhost:8080/api/foos?id=1,2,3 ---- IDs are [1,2,3]
oder eine Liste separater ID- Parameter :
//localhost:8080/api/foos?id=1&id=2 ---- IDs are [1,2]
8. Fazit
In diesem Artikel haben wir gelernt, wie man @RequestParam verwendet.
Den vollständigen Quellcode für die Beispiele finden Sie im GitHub-Projekt.