@RequestParam เทียบกับ @PathVariable


354

อะไรคือความแตกต่างระหว่าง@RequestParamและ@PathVariableในขณะที่ใช้งานอักขระพิเศษ?

+ได้รับการยอมรับโดย@RequestParamas space

ในกรณีของ@PathVariable, ได้รับการยอมรับว่าเป็น++

คำตอบ:


498

หาก 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 "ใบแจ้งหนี้" หรือไม่


11
@PathVariableสามารถใช้ได้ในทุก RequestMethod
Kurai Bankusu

1
@AlexO: สิ่งนี้ไม่เกี่ยวกับ java8 มันใช้งานได้กับ java 5 และ Spring3.0: ประเด็นก็คือรหัสจะถูกคอมไพล์ด้วยการเปิดใช้งานการดีบัก
Ralph

2
@Ralph ถูกต้องใช้งานได้กับการดีบักก่อน Java 8 เนื่องจาก Java 8 ยังทำงานได้โดยไม่ต้องดีบักแทนที่จะใช้ " -parameters ": docs.spring.io/spring/docs/current/spring-framework-reference/ ...... docs.oracle .com / javase / tutorial / reflect / member / …
AlexO

1
@ user3705478: ฉันไม่คิดอย่างนั้นเพราะสปริงจำเป็นต้องรู้ว่านี่เป็นวิธีการจัดการคำขอ (และแน่นอน: ใช้@PathParam งานได้เฉพาะเมื่อมีตัวยึดตำแหน่งในเทมเพลต uri)
Ralph

2
@ user3705478: @PathParamเป็นคำอธิบายประกอบ javax.ws.rs docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

@RequestParamคำอธิบายประกอบที่ใช้สำหรับการเข้าถึงค่าพารามิเตอร์แบบสอบถามจากคำขอ ดู URL คำขอต่อไปนี้:

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

ในคำขอ URL ข้างต้นค่าสำหรับ param1 และ param2 สามารถเข้าถึงได้ดังต่อไปนี้:

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

ต่อไปนี้เป็นรายการของพารามิเตอร์ที่รองรับโดยการเพิ่มความคิดเห็น @RequestParam:

  • defaultValue - นี่คือค่าเริ่มต้นเป็นกลไกทางเลือกหากคำขอไม่มีค่าหรือว่างเปล่า
  • ชื่อ - ชื่อของพารามิเตอร์ที่จะผูก
  • จำเป็นต้องใช้ - ไม่ว่าจะเป็นพารามิเตอร์ที่จำเป็นหรือไม่ หากเป็นจริงการไม่สามารถส่งพารามิเตอร์นั้นจะล้มเหลว
  • value - นี่คือนามแฝงสำหรับแอตทริบิวต์ชื่อ

@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

http: // localhost: 8080 / spring_3_2 / matrixvars / หุ้น; BT.A = 276.70 + 10.40 + 3.91; AZN = 236.00 + 103.00 + 3.29; SBRY = 375.50 + 7.60 + 2.07

และวิธีการควบคุมสำหรับมัน

 @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มีพารามิเตอร์ประเภทหรือไม่? ฉันโน้มตัวไปทำให้มันเป็นตัวแปร
cst1992

1
.. และนี่คือโพสต์ต้นฉบับ: - javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj Malik

สามารถ@PathParamและ@RequestParamประกาศได้โดยไม่ต้องใช้@RequestMapping
sofs1

29

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

ง่ายและชัดเจน @alok
anand krish

12

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

}

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

คำอธิบายประกอบทั้งสองทำงานในลักษณะเดียวกัน

อักขระพิเศษ 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;
    }
}

กดปุ่มคำขอต่อไปนี้ฉันได้รับการตอบกลับแบบเดียวกัน:

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

! @ ได้รับเป็นการตอบกลับทั้งคำขอ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.