@RequestParam vs @PathVariable

353

Jaka jest różnica pomiędzy @RequestParami @PathVariablepodczas obsługi znaków specjalnych?

+został zaakceptowany przez @RequestParamjako przestrzeń.

W przypadku @PathVariable, +została przyjęta jako +.

użytkownik1857181
źródło

Odpowiedzi:

497

Jeśli adres URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013otrzyma 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/invoicesdostarczyłby faktury dla użytkownika nulllub dane dotyczące użytkownika z identyfikatorem „faktury”?

Ralph
źródło
11
@PathVariablemoże być użyty w dowolnym RequestMethod
Kurai Bankusu
1
@AlexO: nie ma to nic wspólnego z java8, działa nawet dla java 5 i Spring3.0: Chodzi o to, że kod jest kompilowany z włączonym debugowaniem.
Ralph
2
@Ralph Prawidłowo działa to z debugowaniem przed Javą 8. Od wersji Java 8 działa również bez debugowania, zamiast tego używa „ -parameters ”: docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .pl / javase / tutorial / reflect / member /…
AlexO 27.10.16
1
@ user3705478: Nie sądzę, ponieważ wiosna musi wiedzieć, że jest to metoda obsługi żądań. (i oczywiście: @PathParam działa tylko wtedy, gdy w szablonie uri znajduje się symbol zastępczy)
Ralph
2
@ user3705478: @PathParamjest adnotacją javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph
112

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&param2=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:

  • defaultValue - Jest to wartość domyślna jako mechanizm rezerwowy, jeśli żądanie nie ma wartości lub jest puste.
  • name - nazwa parametru do powiązania
  • wymagane - czy parametr jest obowiązkowy czy nie. Jeśli to prawda, niepowodzenie wysłania tego parametru zakończy się niepowodzeniem.
  • wartość - jest to alias atrybutu name

@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

http: // localhost: 8080 / spring_3_2 / matrixvars / stocks; BT.A = 276,70, + 10,40, + 3,91; AZN = 236,00, + 103,00, + 3,29; SBRY = 375,50, + 7,60, + 2,07

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" >
Xelian
źródło
Czy łańcuch, taki jak userNameparam typu, czy nie? Skłaniam się ku uczynieniu go zmienną, ale może to być również param.
cst1992
1
..I oto oryginalny post: - javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj Malik
Można @PathParami @RequestParammożna zadeklarować bez użycia@RequestMapping
sofs1
29

@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;
}
alok
źródło
proste i jasne @alok
anand krish
12

1) @RequestParamsł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 @PathVariablesł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) @RequestParamjest bardziej przydatny w tradycyjnej aplikacji internetowej, w której dane są przekazywane głównie w parametrach zapytania, natomiast @PathVariablejest bardziej odpowiedni dla usług sieciowych RESTful, w których adres URL zawiera wartości.

3) @RequestParamadnotacja może określać wartości domyślne, jeśli parametr zapytania nie jest obecny lub pusty za pomocą defaultValueatrybutu, 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";
    }

}
Andrij
źródło
1
@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) {

}
Mathew Menalish
źródło
1

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ź:

  1. localhost: 7000 / pvar /! @ # $% ^ & * () _ + - = [] {} |; ': ",. / <>?
  2. localhost: 7000 / rpvar? param =! @ # $% ^ & * () _ + - = [] {} |; ': ",. / <>?

! @ zostało odebrane jako odpowiedź na oba żądania

Shubham Srivastava
źródło