ChatGPT解决这个技术问题 Extra ChatGPT

@RequestParam 与 @PathVariable

处理特殊字符时,@RequestParam@PathVariable 有什么区别?

+@RequestParam 接受为空格。

@PathVariable 的情况下,+ 被接受为 +


O
Oskarzito

@PathVariable 是从 URI 中获取一些占位符(Spring 称之为 URI 模板)——参见 Spring 参考第 16.3.2.2 章 URI 模板模式

@RequestParam 也是从 URI 中获取参数——参见 Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParam

如果 URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 在 2013 年 12 月 5 日获取用户 1234 的发票,则控制器方法如下所示:

@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 开始,路径变量 can be optional as well。但请注意,这可能会更改 URL 路径层次结构并引入请求映射冲突。例如,/user/invoices 是否会提供用户 null 的发票或 ID 为“发票”的用户的详细信息?


@PathVariable 可用于任何 RequestMethod
@AlexO:这与java8无关,它甚至适用于java 5和Spring3.0:关键是代码是在启用调试的情况下编译的。
@Ralph 正确,这适用于 Java 8 之前的调试。由于 Java 8 它也可以在没有调试的情况下工作,而不是使用“-parameters”:docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle.com/javase/tutorial/reflect/member/…
@user3705478:我不这么认为,因为 spring 需要知道这是一个请求处理程序方法。 (当然:@PathParam 仅在 uri 模板中有占位符时才有效)
@user3705478:@PathParam 是 javax.ws.rs 注释。 docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
X
Xelian

@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 - 要绑定的参数的名称

required - 参数是否是必需的。如果为真,则未能发送该参数将失败。

value – 这是 name 属性的别名

@PathVariable

@PathVariable 标识用于传入请求的 URI 中的模式。让我们看看下面的请求 URL:

http://localhost:8080/springmvc/hello/101?param1=10¶m2=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/stocks;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 是否有类型参数?我倾向于使它成为一个变量,但它也可能是一个参数。
可以在不使用 @RequestMapping 的情况下声明 @PathParam@RequestParam
a
alok

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

i
informatik01

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 在数据主要在查询参数中传递的传统 Web 应用程序中更有用,而 @PathVariable 更适合 URL 包含值的 RESTful Web 服务。

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

}

您的论点 2 是否基于意见,或者您能否提供任何支持该论点的资源?
完美的答案@Andriy
a
andy

可能是application/x-www-form-urlencoded midia类型将space转为+,接收方将+转为space.check获取更多信息的网址。http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1


M
Mathew Menalish
@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) {

}

S
Shubham Srivastava

两个注释的行为方式完全相同。

只有 2 个特殊字符 '!'和 '@' 被 @PathVariable 和 @RequestParam 注释所接受。

为了检查并确认行为,我创建了一个仅包含 1 个控制器的 spring boot 应用程序。

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

点击以下请求我得到了相同的响应:

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

!@ 在两个请求中都作为响应收到


s
sachin dhembre

@RequestParam:我们可以说它是像键值对一样的查询参数@PathVariable:-它来自URI


格式化代码片段以提高可读性