@RequestParam vs @PathVariable


355

Sự khác biệt giữa @RequestParam@PathVariabletrong khi xử lý các ký tự đặc biệt là gì?

+được chấp nhận bởi @RequestParamkhông gian.

Trong trường hợp @PathVariable, +đã được chấp nhận là +.

Câu trả lời:


499

Nếu URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013lấy hóa đơn cho người dùng 1234 vào ngày 5 tháng 12 năm 2013, phương thức điều khiển sẽ như sau:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

Ngoài ra, các tham số yêu cầu có thể là tùy chọn và kể từ các biến đường dẫn của Spring 4.3.3 cũng có thể là tùy chọn . Hãy coi chừng, điều này có thể thay đổi hệ thống phân cấp đường dẫn URL và đưa ra xung đột ánh xạ yêu cầu. Ví dụ: sẽ /user/invoicescung cấp hóa đơn cho người dùng nullhoặc chi tiết về người dùng có "hóa đơn" ID?


11
@PathVariablecó thể được sử dụng trong mọi RequestMethod
Kurai Bankusu

1
@AlexO: điều này không liên quan gì đến java8, nó hoạt động ngay cả đối với java 5 và Spring3.0: Điểm quan trọng là mã được biên dịch với tính năng gỡ lỗi được kích hoạt.
Ralph

2
@Ralph Đúng, điều này hoạt động với gỡ lỗi trước Java 8. Vì Java 8, nó cũng hoạt động mà không cần gỡ lỗi, thay vào đó sử dụng "-parameter": docs.spring.io/spring/docs/cản/spring-framework-reference/ của docs.oracle .com / javase / guide / Reflection / thành viên /
Hoài

1
@ user3705478: Tôi không nghĩ vậy, vì mùa xuân cần biết rằng đây là một phương thức xử lý yêu cầu. (và tất nhiên: @PathParam chỉ hoạt động nếu có một trình giữ chỗ trong mẫu uri)
Ralph

2
@ user3705478: @PathParamlà một chú thích javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

Chú thích @RequestParam được sử dụng để truy cập các giá trị tham số truy vấn từ yêu cầu. Nhìn vào URL yêu cầu sau:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

Trong yêu cầu URL ở trên, các giá trị cho param1 và param2 có thể được truy cập như dưới đây:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

Sau đây là danh sách các tham số được hỗ trợ bởi chú thích @RequestParam:

  • defaultValue - Đây là giá trị mặc định dưới dạng cơ chế dự phòng nếu yêu cầu không có giá trị hoặc nó trống.
  • Tên - Tên của tham số cần liên kết
  • bắt buộc - Cho dù tham số là bắt buộc hay không. Nếu đó là sự thật, việc không gửi tham số đó sẽ thất bại.
  • value - Đây là bí danh cho thuộc tính name

@PathVariable

@ PathVariable xác định mẫu được sử dụng trong URI cho yêu cầu đến. Hãy xem URL yêu cầu bên dưới:

http: // localhost: 8080 / springmvc / xin chào / 101? param1 = 10 & param2 = 20

Yêu cầu URL trên có thể được viết trong Spring MVC của bạn như sau:

@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){
.......
}

Chú thích @ PathVariable chỉ có một giá trị thuộc tính để liên kết mẫu URI yêu cầu. Nó được phép sử dụng nhiều chú thích @ PathVariable trong phương thức đơn. Nhưng, đảm bảo rằng không có nhiều hơn một phương thức có cùng một mẫu.

Ngoài ra còn có một chú thích thú vị hơn: @MatrixVariable

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

Và phương thức điều khiển cho nó

 @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";
  }

Nhưng bạn phải kích hoạt:

<mvc:annotation-driven enableMatrixVariables="true" >

Một chuỗi, chẳng hạn như userNamecó một loại param hay không? Tôi đang nghiêng về việc biến nó thành một biến số, nhưng nó cũng có thể là một thông số.
cst1992

1
.. Và đây là bài viết gốc: - javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj Malik

Có thể @PathParam@RequestParamđược khai báo mà không cần sử dụng@RequestMapping
sofs1

29

@RequestParam được sử dụng cho tham số truy vấn (giá trị tĩnh) như: http: // localhost: 8080 / tính toán / pow? Base = 2 & ext = 4

@PathVariable được sử dụng cho các giá trị động như: http: // localhost: 8080 / tính toán / 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;
}

đơn giản và rõ ràng @alok
anand krish

12

1) @RequestParamđược sử dụng để trích xuất các tham số truy vấn

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được sử dụng để trích xuất dữ liệu ngay từ 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) @RequestParamhữu ích hơn trên một ứng dụng web truyền thống, nơi dữ liệu chủ yếu được truyền vào các tham số truy vấn trong khi @PathVariablephù hợp hơn với các dịch vụ web RESTful nơi URL chứa các giá trị.

3) @RequestParamchú thích có thể chỉ định các giá trị mặc định nếu tham số truy vấn không có hoặc trống bằng cách sử dụng một defaultValuethuộc tính, với điều kiện thuộc tính bắt buộc là 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";
    }

}

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) {

}

1

Cả hai chú thích hành xử chính xác theo cùng một cách.

Chỉ có 2 ký tự đặc biệt '!' và '@' được chấp nhận bởi các chú thích @PathVariable và @RequestParam.

Để kiểm tra và xác nhận hành vi tôi đã tạo một ứng dụng khởi động lò xo chỉ chứa 1 bộ điều khiển.

 @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;
    }
}

Đánh theo các yêu cầu sau Tôi nhận được phản hồi tương tự:

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

! @ đã nhận được phản hồi trong cả hai yêu cầu


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.