购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2.2 参数绑定

在Web应用中,服务端经常需要获取浏览器传递的数据,如搜索查询、分页、排序和过滤等场景。在Spring Boot中,有多种注解可用于将请求中传递的数据绑定到处理器方法的参数中,以便获取并处理这些数据。常用的注解如下。

@PathVariable:从URI模板中提取值,如从/books/{id}中提取id。

@RequestParam:获取查询参数或表单数据。

@RequestBody:将请求主体(通常为JSON或XML)绑定到方法参数。

@RequestHeader:获取请求头的值。

@CookieValue:从Cookie中提取值。

1.查询参数

查询参数,也称为查询字符串参数或URL参数,是URL的一部分,用于传递额外的信息给服务器。这些参数以键-值对的形式存在,并且以问号(?)开头附加到URL后面。多个参数之间通常使用&符号进行分隔。

例如,在以下URL中,query和page是查询参数的键,而springboot和2是对应的值:

    https://example.com/search?query=springboot&page=2

在Web开发中,查询参数常常用于以下场景。

搜索查询:如query=springboot表示一个搜索查询。

分页:如page=2,告诉服务器客户端想要查看第二页的数据。

排序和过滤:如sort=asc&filter=active表示按升序排序并过滤活跃项目。

其他设置或选项:如选择显示的语言、布局选项等。

在Spring Boot中,可以使用@RequestParam注解来获取查询参数的值。例如:

    @GetMapping("/search")
    public String search(@RequestParam String query, @RequestParam int page) {
       // 此处的query和page参数将自动赋值为URL中相应查询参数的值
    }

如果HTTP请求中的参数名称与控制器方法的参数名称相同,可以省略@RequestParam注解。在这种情况下,Spring会自动进行数据绑定,将请求参数的值赋给方法参数。因此,上述代码也可以简化为:

    @GetMapping("/search")
    public String search(String query,int page) {
       // query和page参数同样会自动映射
    }

然而,如果HTTP请求中的参数名称与方法的参数名称不一致,这种情况比较少见,这时就需要使用@RequestParam来明确指定映射关系。例如:

    @GetMapping("/example")
    public String example(@RequestParam("paramName") String myVar) {
       // 将请求中的paramName参数映射到方法的myVar参数
    }

在这个例子中,HTTP请求中的参数名为paramName,而方法中的参数名为myVar。如果省略@RequestParam,则Spring会尝试查找一个名为myVar的请求参数,这显然不是我们想要的。

@RequestParam注解支持设置参数为可选,并允许为这些参数指定默认值。例如:

    @GetMapping("/example")
    public String example(@RequestParam(name="param", required=false,
    defaultValue="default") String param) {.
    }

在这个例子中,param参数被设置为可选的(required=false),并且当未提供param参数时,默认值将是default。这意味着方法在不同请求情况下的行为如下。

对于请求/example?param=test,param参数的值将是test。

对于请求/example(不含查询参数),param参数的值将是默认的default。

对于请求/example?anotherParam=value(未提供param参数),param参数的值仍是default。

2.路径变量

有时,数据会嵌入URL的路径中。例如,/books/123,此时,可以使用@PathVariable来捕获这些数据。例如:

    @GetMapping("/books/{bookId}")
    public String getBook(@PathVariable String bookId) {
    }

上述代码将URL路径中的bookId变量值绑定至@PathVariable注解修饰的变量中。对于URL / books /123,bookId变量的值将是123。

3.请求体

在前后端分离的应用或RESTful服务中,客户端常常通过JSON或XML格式在请求体中发送数据。在Spring Boot中,@RequestBody注解用于读取HTTP请求的正文(body),并将其反序列化成相应的Java对象。

以下是一个简单的示例,演示如何使用@RequestBody来接收一个JSON对象。

假设有一个名为Book的简单Java POJO类来表示书籍,该类存放于com.example.demo.model包中,代码如下。

    public class Book {
       private String title;
       private String author;
       // 省略构造函数、Getter和Setter方法
    }

然后,在控制器中使用@RequestBody注解来添加一个方法,该方法用于创建新书籍,代码如下。

    @PostMapping("/")
    public String createBook(@RequestBody Book book) {
        // 保存书籍或进行其他处理
        return "创建成功";
    }

当客户端发送以下HTTP POST请求时:

    POST /books/
    Content-Type: application/json
 
    {
       "title": "The Great Gatsby",
       "author": "F. Scott Fitzgerald"
    }

Spring将自动将请求体中的JSON数据反序列化为Book对象,并将其传递给createBook方法。在这个方法中,可以执行保存操作或其他逻辑处理。

这种方式在需要处理来自前端应用(如Angular、React或Vue.js)发送的复杂数据结构时非常有用。

4.HTTP头

有时某些数据会通过HTTP请求头发送,如User-Agent或自定义的头信息。在Spring Boot中,可以使用@RequestHeader来获取特定的头信息,使用方法如下。

    @GetMapping("/endpoint")
    public String handleRequest(@RequestHeader("User-Agent") String userAgent) {
    }

上述代码将HTTP请求头中的User-Agent属性值绑定到userAgent变量中。

5.Cookie

在Web应用中,浏览器可以存储数据在Cookie中,并在每个请求中发送这些数据,在Spring Boot中,可以使用@CookieValue来读取特定的Cookie值。这个注解将指定名称的Cookie值绑定到控制器方法的参数上。例如:

    @GetMapping("/profile")
    public String getProfile(@CookieValue("sessionId") String sessionId) {
        // sessionId参数现在包含名为sessionId的Cookie的值
        // 可以根据这个sessionId来执行进一步的逻辑处理
        return "用户资料";
    }

在上述代码中,@CookieValue("sessionId")注解用于从HTTP请求的Cookies中查找名为sessionId的Cookie,并将其值绑定到方法参数sessionId上。这种方法非常适用于处理需要使用Cookies中存储的数据的场景,如在用户认证或会话管理中。 EJSGtx7F1rInbbMd8Ws+QReNn0ffqGqGTtFiadrGiP2A2pZmM6w19td0yss922zF

点击中间区域
呼出菜单
上一章
目录
下一章
×