Apa perbedaan antara @RequestParam
dan @PathVariable
saat menangani karakter khusus?
+
diterima @RequestParam
sebagai ruang.
Dalam hal @PathVariable
, +
diterima sebagai +
.
Apa perbedaan antara @RequestParam
dan @PathVariable
saat menangani karakter khusus?
+
diterima @RequestParam
sebagai ruang.
Dalam hal @PathVariable
, +
diterima sebagai +
.
Jawaban:
@PathVariable
adalah untuk mendapatkan tempat penampung dari URI (Spring menyebutnya sebagai Templat URI) - lihat Referensi Spring Bab 16.3.2.2 Pola Templat URI@RequestParam
adalah untuk mendapatkan parameter dari URI juga - lihat Referensi Pegas Bab 16.3.3.3 Mengikat parameter permintaan ke parameter metode dengan @RequestParamJika URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
mendapatkan 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/invoices
memberikan faktur untuk pengguna null
atau detail tentang pengguna dengan "faktur" ID?
@PathParam
hanya berfungsi jika ada placeholder dalam templat uri)
@PathParam
adalah anotasi javax.ws.rs. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Penjelasan @RequestParam digunakan untuk mengakses nilai parameter kueri dari permintaan. Lihatlah URL permintaan berikut:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=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:
@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
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" >
userName
memiliki param tipe atau tidak? Saya condong ke arah membuatnya menjadi variabel, tapi itu bisa menjadi param juga.
@PathParam
dan @RequestParam
dideklarasikan tanpa menggunakan@RequestMapping
@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;
}
1) @RequestParam
digunakan 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 @PathVariable
digunakan 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) @RequestParam
lebih berguna pada aplikasi web tradisional di mana data sebagian besar diteruskan dalam parameter kueri sementara @PathVariable
lebih cocok untuk layanan web RESTful di mana URL berisi nilai.
3) @RequestParam
anotasi dapat menentukan nilai default jika parameter kueri tidak ada atau kosong dengan menggunakan defaultValue
atribut, 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";
}
}
@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) {
}
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:
! @ diterima sebagai respons di kedua permintaan
mungkin saja tipe midia aplikasi / x-www-form-urlencoded mengubah ruang menjadi + , dan penerima akan mendekode data dengan mengonversi + ke ruang. centang URL untuk info lebih lanjut. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
dapat digunakan dalam RequestMethod