В чем разница между специальными символами @RequestParam
и @PathVariable
при их обработке?
+
был принят @RequestParam
как пространство.
В случае @PathVariable
, +
был принят как +
.
В чем разница между специальными символами @RequestParam
и @PathVariable
при их обработке?
+
был принят @RequestParam
как пространство.
В случае @PathVariable
, +
был принят как +
.
Ответы:
@PathVariable
чтобы получить некоторый заполнитель из URI (Spring называет его шаблоном URI ) - см. Spring Reference Глава 16.3.2.2 Шаблоны шаблонов URI@RequestParam
это также получение параметра из URI - см. Spring Reference Глава 16.3.3.3 Связывание параметров запроса с параметрами метода с помощью @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
или сведения о пользователе с идентификатором «счета-фактуры»?
@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: // локальный: 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
типа param или нет? Я склоняюсь к тому, чтобы сделать его переменным, но это тоже может быть параметром.
@PathParam
и @RequestParam
объявить без использования@RequestMapping
@RequestParam используется для параметра запроса (статические значения), например: http: // localhost: 8080 / analysis / pow? Base = 2 & ext = 4
@PathVariable используется для динамических значений, таких как: http: // localhost: 8080 / analysis / 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);
}
while @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 application / x-www-form-urlencoded преобразует пространство в + , а получатель будет декодировать данные путем преобразования + в пробел. проверьте URL для получения дополнительной информации. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
@PathVariable
можно использовать в любом RequestMethod