Was ist der Unterschied zwischen @RequestParam
und @PathVariable
beim Umgang mit Sonderzeichen?
+
wurde von @RequestParam
als Raum akzeptiert .
Im Falle von @PathVariable
wurde +
als akzeptiert +
.
Was ist der Unterschied zwischen @RequestParam
und @PathVariable
beim Umgang mit Sonderzeichen?
+
wurde von @RequestParam
als Raum akzeptiert .
Im Falle von @PathVariable
wurde +
als akzeptiert +
.
Antworten:
@PathVariable
Um einen Platzhalter aus dem URI zu erhalten (Spring nennt ihn eine URI-Vorlage) - siehe Spring-Referenz Kapitel 16.3.2.2 URI-Vorlagenmuster@RequestParam
soll auch einen Parameter vom URI erhalten - siehe Spring Reference Kapitel 16.3.3.3 Binden von Anforderungsparametern an Methodenparameter mit @RequestParamWenn die URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
am 5. Dezember 2013 die Rechnungen für Benutzer 1234 erhält, sieht die Controller-Methode folgendermaßen aus:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Außerdem können Anforderungsparameter optional sein, und ab Spring 4.3.3 können auch Pfadvariablen optional sein . Beachten Sie jedoch, dass dies die URL-Pfadhierarchie ändern und Konflikte bei der Anforderungszuordnung verursachen kann. Würden Sie beispielsweise /user/invoices
die Rechnungen für den Benutzer null
oder Details zu einem Benutzer mit der ID "Rechnungen" bereitstellen ?
@PathParam
funktioniert nur, wenn die Uri-Vorlage einen Platzhalter enthält)
@PathParam
ist eine Annotation von javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
@ RequestParam- Annotation, die für den Zugriff auf die Abfrageparameterwerte aus der Anforderung verwendet wird. Sehen Sie sich die folgende Anforderungs-URL an:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
In der obigen URL-Anfrage kann auf die Werte für param1 und param2 wie folgt zugegriffen werden:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Im Folgenden finden Sie eine Liste der Parameter, die von der Annotation @RequestParam unterstützt werden:
@ PathVariable
@ PathVariable identifiziert das Muster, das im URI für die eingehende Anforderung verwendet wird. Schauen wir uns die folgende Anforderungs-URL an:
http: // localhost: 8080 / springmvc / hello / 101? param1 = 10 & param2 = 20
Die obige URL-Anfrage kann wie folgt in Ihre Spring MVC geschrieben werden:
@RequestMapping("/hello/{id}") public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
Die Annotation @ PathVariable enthält nur einen Attributwert zum Binden der Anforderungs-URI-Vorlage. Es ist erlaubt, das multiple @ zu verwenden Annotation PathVariable in der einzelnen Methode zu verwenden. Stellen Sie jedoch sicher, dass nicht mehr als eine Methode dasselbe Muster aufweist.
Außerdem gibt es noch eine interessante Anmerkung: @MatrixVariable
Und die Controller-Methode dafür
@RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {
logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });
List<List<String>> outlist = map2List(matrixVars);
model.addAttribute("stocks", outlist);
return "stocks";
}
Aber Sie müssen aktivieren:
<mvc:annotation-driven enableMatrixVariables="true" >
userName
einen Typparameter, haben oder nicht? Ich neige dazu, es zu einer Variablen zu machen, aber es könnte auch ein Parameter sein.
@PathParam
und @RequestParam
kann ohne Verwendung deklariert werden@RequestMapping
@RequestParam wird für Abfrageparameter (statische Werte) wie: http: // localhost: 8080 / berechnung / pow? Base = 2 & ext = 4 verwendet
@PathVariable wird für dynamische Werte wie http: // localhost: 8080 / berechnung / sqrt / 8 verwendet
@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
int pow = (int) Math.pow(base1, ext1);
return pow;
}
@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
double sqrtnum=Math.sqrt(num1);
return sqrtnum;
}
1) @RequestParam
wird verwendet, um Abfrageparameter zu extrahieren
http://localhost:3000/api/group/test?id=4
@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
while @PathVariable
wird verwendet, um Daten direkt aus dem URI zu extrahieren:
http://localhost:3000/api/group/test/4
@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}
2) @RequestParam
ist nützlicher in einer herkömmlichen Webanwendung, in der Daten meistens in den Abfrageparametern übergeben werden, während @PathVariable
es besser für RESTful-Webdienste geeignet ist, in denen URL Werte enthält.
3) @RequestParam
Annotation kann Standardwerte angeben , wenn ein Abfrageparameter nicht vorhanden oder leer ist, indem ein defaultValue
Attribut verwendet wird, vorausgesetzt, das erforderliche Attribut lautet false
:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
return "Required element of request param";
}
}
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
http://localhost:8080/employee/call/7865467
@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = false) String callStatus) {
}
http://localhost:8080/app/call/7865467?status=Cancelled
@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = true) String callStatus) {
}
Beide Anmerkungen verhalten sich genau gleich.
Nur 2 Sonderzeichen '!' und '@' werden von den Anmerkungen @PathVariable und @RequestParam akzeptiert.
Um das Verhalten zu überprüfen und zu bestätigen, habe ich eine Spring-Boot-Anwendung erstellt, die nur 1 Controller enthält.
@RestController
public class Controller
{
@GetMapping("/pvar/{pdata}")
public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
{
return pathdata;
}
@GetMapping("/rpvar")
public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
{
return paramdata;
}
}
Bei folgenden Anfragen habe ich die gleiche Antwort erhalten:
! @ wurde in beiden Anfragen als Antwort empfangen
Es kann sein, dass die Anwendung / x-www-form-urlencoded midia type Leerzeichen in + konvertiert und der Empfänger die Daten durch Konvertieren von + in Leerzeichen dekodiert. Überprüfen Sie die URL, um weitere Informationen zu erhalten. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
kann in jeder RequestMethod