@RequestParam vs @PathVariable


355

Apa perbedaan antara @RequestParamdan @PathVariablesaat menangani karakter khusus?

+diterima @RequestParamsebagai ruang.

Dalam hal @PathVariable, +diterima sebagai +.

Jawaban:


499

Jika URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013mendapatkan faktur untuk pengguna 1234 pada 5 Desember 2013, metode pengontrol akan terlihat seperti:

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

Selain itu, parameter permintaan bisa opsional, dan pada variabel jalur Spring 4.3.3 juga bisa opsional . Namun berhati-hatilah, ini dapat mengubah hierarki jalur URL dan memperkenalkan konflik pemetaan permintaan. Misalnya, apakah akan /user/invoicesmemberikan faktur untuk pengguna nullatau detail tentang pengguna dengan "faktur" ID?


11
@PathVariabledapat digunakan dalam RequestMethod
Kurai Bankusu

1
@AlexO: ini tidak ada hubungannya dengan java8, ia berfungsi bahkan untuk java 5 dan Spring3.0: Intinya adalah bahwa kode dikompilasi dengan debugging diaktifkan.
Ralph

2
@Ralph Benar, ini berfungsi dengan debugging sebelum Java 8. Karena Java 8 juga bekerja tanpa debugging, alih-alih menggunakan "-parameters": docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / tutorial / refleksi / anggota / ...
AlexO

1
@ user3705478: saya rasa tidak, karena pegas perlu tahu bahwa ini adalah metode penangan permintaan. (dan tentu saja: @PathParam hanya berfungsi jika ada placeholder dalam templat uri)
Ralph

2
@ user3705478: @PathParamadalah anotasi javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

Penjelasan @RequestParam digunakan untuk mengakses nilai parameter kueri dari permintaan. Lihatlah URL permintaan berikut:

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

Dalam permintaan URL di atas, nilai-nilai untuk param1 dan param2 dapat diakses seperti di bawah ini:

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

Berikut ini adalah daftar parameter yang didukung oleh penjelasan @RequestParam:

  • defaultValue - Ini adalah nilai default sebagai mekanisme fallback jika permintaan tidak memiliki nilai atau kosong.
  • name - Nama parameter yang akan diikat
  • diperlukan - Apakah parameter ini wajib atau tidak. Jika itu benar, gagal mengirim parameter itu akan gagal.
  • value - Ini adalah alias untuk atribut nama

@PathVariable

@ PathVariable mengidentifikasi pola yang digunakan dalam URI untuk permintaan yang masuk. Mari kita lihat URL permintaan di bawah ini:

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

Permintaan URL di atas dapat ditulis dalam Spring MVC Anda seperti di bawah ini:

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

Anotasi @ PathVariable hanya memiliki satu nilai atribut untuk mengikat templat URI permintaan. Diizinkan untuk menggunakan anotasi @ PathVariable multipel dalam metode tunggal. Tetapi, pastikan bahwa tidak lebih dari satu metode memiliki pola yang sama.

Juga ada satu lagi anotasi menarik: @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

Dan metode Pengontrol untuk itu

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

Tetapi Anda harus mengaktifkan:

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

Akankah sebuah string, seperti userNamememiliki param tipe atau tidak? Saya condong ke arah membuatnya menjadi variabel, tapi itu bisa menjadi param juga.
cst1992

1
..Dan di sini adalah posting asli: - javabeat.net/spring-mvc-requestparam-pathvariable
Malik

Dapat @PathParamdan @RequestParamdideklarasikan tanpa menggunakan@RequestMapping
sofs1

29

@RequestParam digunakan untuk parameter kueri (nilai statis) seperti: http: // localhost: 8080 / perhitungan / pow? Base = 2 & ext = 4

@PathVariable digunakan untuk nilai dinamis seperti: http: // localhost: 8080 / perhitungan / 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;
}

sederhana dan jelas @alok
anand krish

12

1) @RequestParamdigunakan untuk mengekstrak parameter kueri

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

sementara @PathVariabledigunakan untuk mengekstrak data langsung dari 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) @RequestParamlebih berguna pada aplikasi web tradisional di mana data sebagian besar diteruskan dalam parameter kueri sementara @PathVariablelebih cocok untuk layanan web RESTful di mana URL berisi nilai.

3) @RequestParamanotasi dapat menentukan nilai default jika parameter kueri tidak ada atau kosong dengan menggunakan defaultValueatribut, asalkan atribut yang diperlukan adalah 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

Kedua penjelasan berperilaku persis dengan cara yang sama.

Hanya 2 karakter khusus '!' dan '@' diterima oleh anotasi @PathVariable dan @RequestParam.

Untuk memeriksa dan mengkonfirmasi perilaku saya telah membuat aplikasi boot spring yang hanya berisi 1 controller.

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

Memukul Permintaan berikut, saya mendapat respons yang sama:

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

! @ diterima sebagai respons di kedua permintaan


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.