อะไรคือความแตกต่างระหว่าง@RequestParam
และ@PathVariable
ในขณะที่ใช้งานอักขระพิเศษ?
+
ได้รับการยอมรับโดย@RequestParam
as space
ในกรณีของ@PathVariable
, ได้รับการยอมรับว่าเป็น+
+
อะไรคือความแตกต่างระหว่าง@RequestParam
และ@PathVariable
ในขณะที่ใช้งานอักขระพิเศษ?
+
ได้รับการยอมรับโดย@RequestParam
as space
ในกรณีของ@PathVariable
, ได้รับการยอมรับว่าเป็น+
+
คำตอบ:
@PathVariable
คือการขอรับตัวยึดจาก URI (สปริงเรียกว่าเทมเพลต URI) - ดูที่การอ้างอิงสปริงบทที่ 16.3.2.2 รูปแบบเทมเพลต URI@RequestParam
คือการรับพารามิเตอร์จาก URI ด้วย - ดูที่Spring Reference บทที่ 16.3.3.3 การผูกพารามิเตอร์คำขอเข้ากับพารามิเตอร์ method ด้วย @RequestParamหาก URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
ได้รับใบแจ้งหนี้สำหรับผู้ใช้ 1234 ในวันที่ 5 ธันวาคม 2013 วิธีการควบคุมจะมีลักษณะดังนี้:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
นอกจากนี้ค่าคำขอสามารถเลือกและเป็นแห่งฤดูใบไม้ผลิ 4.3.3 ตัวแปรเส้นทางสามารถเลือกได้เช่นกัน แต่ระวังสิ่งนี้อาจเปลี่ยนลำดับชั้นของเส้นทาง URL และแนะนำความขัดแย้งในการจับคู่คำขอ ตัวอย่างเช่นจะ/user/invoices
ให้ใบแจ้งหนี้สำหรับผู้ใช้null
หรือรายละเอียดเกี่ยวกับผู้ใช้ที่มี ID "ใบแจ้งหนี้" หรือไม่
@PathParam
งานได้เฉพาะเมื่อมีตัวยึดตำแหน่งในเทมเพลต uri)
@PathParam
เป็นคำอธิบายประกอบ javax.ws.rs docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
@RequestParamคำอธิบายประกอบที่ใช้สำหรับการเข้าถึงค่าพารามิเตอร์แบบสอบถามจากคำขอ ดู URL คำขอต่อไปนี้:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
ในคำขอ URL ข้างต้นค่าสำหรับ param1 และ param2 สามารถเข้าถึงได้ดังต่อไปนี้:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
ต่อไปนี้เป็นรายการของพารามิเตอร์ที่รองรับโดยการเพิ่มความคิดเห็น @RequestParam:
@PathVariable
@ PathVariableระบุรูปแบบที่ใช้ใน URI สำหรับคำขอขาเข้า ลองดู URL คำขอด้านล่าง:
http: // localhost: 8080 / springmvc / สวัสดี / 101 param1 = 10 & param2 = 20
คำขอ URL ข้างต้นสามารถเขียนได้ใน Spring MVC ของคุณดังนี้:
@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){
.......
}
คำอธิบายประกอบ@ PathVariableมีเพียงค่าแอตทริบิวต์เดียวสำหรับผูกเท็มเพลต URI คำขอ ได้รับอนุญาตให้ใช้คำอธิบายประกอบ@ PathVariableหลายรายการในวิธีการเดียว แต่ให้แน่ใจว่าไม่มีมากกว่าหนึ่งวิธีที่มีรูปแบบเดียวกัน
นอกจากนี้ยังมีคำอธิบายประกอบที่น่าสนใจอีกหนึ่งรายการ: @MatrixVariable
และวิธีการควบคุมสำหรับมัน
@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";
}
แต่คุณต้องเปิดใช้งาน:
<mvc:annotation-driven enableMatrixVariables="true" >
userName
มีพารามิเตอร์ประเภทหรือไม่? ฉันโน้มตัวไปทำให้มันเป็นตัวแปร
@PathParam
และ@RequestParam
ประกาศได้โดยไม่ต้องใช้@RequestMapping
@RequestParam ใช้สำหรับพารามิเตอร์การค้นหา (ค่าคงที่) เช่น: http: // localhost: 8080 / การคำนวณ / pow? base = 2 & ext = 4
@PathVariable ใช้สำหรับค่าแบบไดนามิกเช่น: http: // localhost: 8080 / การคำนวณ / 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
ใช้เพื่อแยกพารามิเตอร์ข้อความค้นหา
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);
}
ขณะที่@PathVariable
ใช้เพื่อดึงข้อมูลจาก 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
มีประโยชน์มากขึ้นในแอปพลิเคชันเว็บแบบเดิมที่ข้อมูลส่วนใหญ่ผ่านพารามิเตอร์การสืบค้นในขณะที่@PathVariable
เหมาะสำหรับ RESTful เว็บเซอร์วิสที่ URL มีค่า
3) @RequestParam
คำอธิบายประกอบสามารถระบุค่าเริ่มต้นหากพารามิเตอร์การค้นหาไม่ปรากฏขึ้นหรือว่างเปล่าโดยใช้defaultValue
แอตทริบิวต์โดยมีแอตทริบิวต์ที่จำเป็นคือ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) {
}
คำอธิบายประกอบทั้งสองทำงานในลักษณะเดียวกัน
อักขระพิเศษ 2 ตัวเท่านั้น '!' และ '@' ได้รับการยอมรับโดยคำอธิบายประกอบ @PathVariable และ @RequestParam
ในการตรวจสอบและยืนยันการทำงานฉันได้สร้างแอพพลิเคชั่นบู๊ทสปริงที่มีคอนโทรลเลอร์เพียง 1 ตัว
@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;
}
}
กดปุ่มคำขอต่อไปนี้ฉันได้รับการตอบกลับแบบเดียวกัน:
! @ ได้รับเป็นการตอบกลับทั้งคำขอ
อาจเป็นได้ว่าชนิด midia ของแอปพลิเคชัน / x-www-form-urlencoded แปลงพื้นที่เป็น+และผู้ Reciever จะถอดรหัสข้อมูลโดยการแปลง+เป็น space.check url สำหรับข้อมูลเพิ่มเติม http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
สามารถใช้ได้ในทุก RequestMethod