Jaka jest różnica pomiędzy @RequestParam
i @PathVariable
podczas obsługi znaków specjalnych?
+
został zaakceptowany przez @RequestParam
jako przestrzeń.
W przypadku @PathVariable
, +
została przyjęta jako +
.
Jaka jest różnica pomiędzy @RequestParam
i @PathVariable
podczas obsługi znaków specjalnych?
+
został zaakceptowany przez @RequestParam
jako przestrzeń.
W przypadku @PathVariable
, +
została przyjęta jako +
.
Odpowiedzi:
@PathVariable
jest uzyskanie symbolu zastępczego z URI (Spring nazwać to szablon URI) - patrz Spring Reference Rozdział 16.3.2.2 Wzory szablonów URI@RequestParam
jest również uzyskanie parametru z URI - patrz Rozdział 16.3.3.3 Odwołania do wiosny Parametry powiązania parametrów z parametrami metody za pomocą @RequestParamJeśli adres URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
otrzyma faktury dla użytkownika 1234 w dniu 5 grudnia 2013 r., Metoda kontrolera wyglądałaby następująco:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Ponadto parametry żądania mogą być opcjonalne, a od wiosny 4.3.3 zmienne ścieżki mogą być opcjonalne . Uwaga: może to zmienić hierarchię ścieżki adresu URL i wprowadzić konflikty mapowania żądań. Na przykład, czy /user/invoices
dostarczyłby faktury dla użytkownika null
lub dane dotyczące użytkownika z identyfikatorem „faktury”?
@PathParam
działa tylko wtedy, gdy w szablonie uri znajduje się symbol zastępczy)
@PathParam
jest adnotacją javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Adnotacja @RequestParam używana do uzyskiwania dostępu do wartości parametrów zapytania z żądania. Spójrz na następujący adres URL żądania:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
W powyższym żądaniu adresu URL wartości parametrów param1 i param2 są dostępne w następujący sposób:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Oto lista parametrów obsługiwanych przez adnotację @RequestParam:
@PathVariable
@ PathVariable identyfikuje wzorzec używany w URI dla przychodzącego żądania. Spójrzmy na poniższy adres URL żądania:
http: // localhost: 8080 / springmvc / hello / 101? param1 = 10 i param2 = 20
Powyższe żądanie adresu URL można zapisać w Spring MVC, jak poniżej:
@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){
.......
}
Adnotacja @ PathVariable ma tylko jedną wartość atrybutu do powiązania szablonu URI żądania. Dozwolone jest stosowanie wielu adnotacji @ PathVariable w jednej metodzie. Ale upewnij się, że nie więcej niż jedna metoda ma ten sam wzór.
Jest jeszcze jedna interesująca adnotacja: @MatrixVariable
I metoda kontrolera
@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";
}
Ale musisz włączyć:
<mvc:annotation-driven enableMatrixVariables="true" >
userName
param typu, czy nie? Skłaniam się ku uczynieniu go zmienną, ale może to być również param.
@PathParam
i @RequestParam
można zadeklarować bez użycia@RequestMapping
@RequestParam służy do parametru zapytania (wartości statyczne), takiego jak: http: // localhost: 8080 / obliczenia / pow? Base = 2 i ext = 4
@PathVariable służy do dynamicznych wartości takich jak: http: // localhost: 8080 / obliczenia / sqrt / 8
@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
służy do wyodrębnienia parametrów zapytania
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
służy do wyodrębniania danych bezpośrednio z identyfikatora URI:
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
jest bardziej przydatny w tradycyjnej aplikacji internetowej, w której dane są przekazywane głównie w parametrach zapytania, natomiast @PathVariable
jest bardziej odpowiedni dla usług sieciowych RESTful, w których adres URL zawiera wartości.
3) @RequestParam
adnotacja może określać wartości domyślne, jeśli parametr zapytania nie jest obecny lub pusty za pomocą defaultValue
atrybutu, pod warunkiem, że wymagany atrybut to 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) {
}
Oba adnotacje zachowują się dokładnie tak samo.
Tylko 2 znaki specjalne „!” i „@” są akceptowane w adnotacjach @PathVariable i @RequestParam.
Aby sprawdzić i potwierdzić zachowanie, stworzyłem aplikację do rozruchu wiosennego, która zawiera tylko 1 kontroler.
@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;
}
}
Otrzymałem tę samą odpowiedź:
! @ zostało odebrane jako odpowiedź na oba żądania
może się zdarzyć, że aplikacja / x-www-form-urlencoded midia type przekonwertuje przestrzeń na + , a odbiorca zdekoduje dane poprzez konwersję + na spację. zaznacz adres URL, aby uzyskać więcej informacji. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
może być użyty w dowolnym RequestMethod