@RequestParam vs @PathVariable


353

У чому різниця між @RequestParamта @PathVariableобробкою спеціальних символів?

+було прийнято @RequestParamяк простір.

У разі @PathVariable, +було прийнято як +.

Відповіді:


497

Якщо 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) {
  ...
}

Крім того, параметри запиту можуть бути необов’язковими, а станом на Spring 4.3.3 змінні шляху також можуть бути необов'язковими . Але будьте обережні, це може змінити ієрархію шляху URL та ввести конфлікти відображення запитів. Наприклад, чи /user/invoicesнадаватимуть рахунки-фактури для користувача nullабо реквізити про користувача з ідентифікаційними "рахунками"?


11
@PathVariableможе використовуватися в будь-якому RequestMethod
Kurai Bankusu

1
@AlexO: це не має нічого спільного з java8, він працює навіть для java 5 та Spring3.0: Справа в тому, що код компілюється з увімкненою налагодженням.
Ральф

2
@Ralph Correct, це працює з налагодженням до Java 8. Оскільки Java 8 також працює без налагодження, замість цього використовується " -parameters ": docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / навчальний посібник / рефлексія / член /…
AlexO

1
@ user3705478: Я не вважаю так, тому що навесні потрібно знати, що це метод обробки запиту. (і звичайно: @PathParam працює лише за умови, що в шаблоні урі є заповнювач)
Ральф

2
@ user3705478: @PathParamце примітка javax.ws.rs docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ральф

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 - Це значення за замовчуванням як механізм резервного копіювання, якщо запит не має значення або він порожній.
  • name - ім'я параметра, який потрібно прив’язати
  • обов'язково - параметр є обов'язковим чи ні. Якщо це правда, не надіслати цей параметр не вдасться.
  • значення - Це псевдонім для атрибута імені

@PathVariable

@ PathVariable визначає шаблон, який використовується в URI для вхідного запиту. Давайте розглянемо нижченаведену URL-адресу запиту:

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

Наведений вище запит на URL-адресу можна записати у ваш весняний 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 / stock; BT.A = 276.70, + 10.40, + 3.91; AZN = 236.00, + 103.00, + 3.29; SBRY = 375.50, + 7.60, + 2.07

І метод Controller для цього

 @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
Меджрай Малик,

Можна @PathParamі @RequestParamоголосити без використання@RequestMapping
sofs1

29

@RequestParam використовується для параметра запиту (статичні значення), наприклад: http: // localhost: 8080 / Calculation / pow? Base = 2 & ext = 4

@PathVariable використовується для динамічних значень, таких як: http: // localhost: 8080 / Calculation / 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 =! @ # $% ^ & * () _ + - = [] {} |; ': ",. / <>?

! @ отримали відповідь в обох запитах


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.