掘金 后端 ( ) • 2024-06-27 17:42

不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多,主要从事物联网/车联网相关领域和业务。喜欢交友、骑行、写毛笔字、弹吉他、折腾硬件和写代码。


导读

这是一系列关于 SpringBoot Web框架实战 的教程,从项目的创建,到一个完整的 web 框架(包括异常处理、拦截器、context 上下文等);从0开始,到一个可以直接运用在生产环境中的web框架。而且所有源码均开源:https://github.com/xiongxianhe/springboot


正文

上一遍《Spring Boot 返回 JSON》 中我们学习了如何从 Spring Boot 返回 json 数据,这篇我们继续讨论,Spring Boot 如何获取 HTTP 传递的参数。

从 HTTP 协议中,我们可知,传递参数的方式有这么几种:

  1. 在 uri 中通过拼接查询字符串传递,这是我们常用的 HTTP GET 方式;
  2. 在 HTTP 中的 body 中传递,由于 body 中传递数据的大小不限,所以这种方式可以传递多种格式的数据,如:multipart/form-data、application/x-www-form-urlencode、application/json、application/xml、text/plain、text/html 等;这类方式为 HTTP POST 方式。

下面我们讨论几种常用的方式:

方式一:在 controller 类的 action 方法中,把所需要的参数作为 action 方法的参数(get/post)

    @RequestMapping("/user/login")
    public String login(String name, String pwd) {
        String res = "you input: name:" + name + "; pwd:" + pwd;
        return res;
    }

这种方式同时支持这种方式同时支持 get 和 post(仅支持 multipart/form-data、application/x-www-form-urlencode )

方式二:在 controller 类的 action 方法中, 通过 HttpServletRequest 作为 action 方法的参数(get/post)

@RequestMapping("/user/login2")
public String login2(HttpServletRequest request) {
    String name = request.getParameter("name");
    String pwd = request.getParameter("pwd");
    return "you input: name:" + name + "; pwd:" + pwd;
}

这种方式同时支持这种方式同时支持 get 和 post(仅支持 multipart/form-data、application/x-www-form-urlencode )

方式三:在 controller 类的 action 方法中, 通过 bean 作为 action 方法的参数(get/post)

@RequestMapping("/user/login3")
public String login3(User user) {
    return user.toString();
}

User.java 内容:

package com.jdz.beans;

public class User {
    private Integer uid;
    private String name;
    private String pwd;

    @Override
    public String toString() {
        return String.format("uid: %d name: %s pwd:%s", this.uid, this.name, this.pwd);
    }
}

这种方式同时支持这种方式同时支持 get 和 post(仅支持 multipart/form-data、application/x-www-form-urlencode )

方式四:通过 @PathVariable 获取 uri 路径中的参数(get)

@RequestMapping(value = "/user/login4/{name}/{pwd}", method = RequestMethod.GET)
public String login4(@PathVariable String name, @PathVariable String pwd) {
    return "you input: name:" + name + "; pwd:" + pwd;
}

请求方式:

http://localhost:8080/user/login4/name-lg4/pwd-lg4

这种方式只适合 get 方法

方式五:通过 @RequestParam 注解(get/post)

@RequestMapping("/user/login5")
public String login5(@RequestParam(value = "name", required = true) String name, @RequestParam("pwd") String pwd) {
    return "you input: name:" + name + "; pwd:" + pwd;
}

这种方式同时支持这种方式同时支持 get 和 post(仅支持 multipart/form-data、application/x-www-form-urlencode )

方式六:通过 @RequestParam 注解,并用 Map 来接收参数(get/post)

@RequestMapping("/user/login6")
public String login6(@RequestParam Map<String, Object> params) {
    return "you input: name:" + params.get("name") + "; pwd:" + params.get("pwd");
}

这种方式同时支持这种方式同时支持 get 和 post(仅支持 multipart/form-data、application/x-www-form-urlencode )

方式七:通过 @RequestBody 注解,并用 Map 来接收参数(json)

@RequestMapping("/user/login7")
public String login7(@RequestBody Map<String, Object> params) {
    return "you input: name:" + params.get("name") + "; pwd:" + params.get("pwd");
}

这种方式适合 application/json ,用于获取 json 格式

其他

在此基础上还有其他的方式,上面主要列举了一些常用的用法,每种用法可以根据实际场景进行选择使用。

源码:https://github.com/xiongxianhe/springboot.git


系列文章
【SpringBoot Web框架实战(开源)】001 使用 pom 方式创建 SpringBoot 第一个项目
【SpringBoot Web框架实战教程(开源)】02 SpringBoot 返回 JSON


近期文章
# 车联网
【自动化运维】不要相信人,把所有的东西都交给机器去处理
从华为无线网络框架说Dispatch服务
百万级物联网框架设计
高并发服务器之泄峰

#硬件
stm32驱动直流电机实现启动/加速/减速/倒车/停车等功能
stm32 定时器输出比较(OC)与PWM的理解和应用
stm32 定时器中断
STM32 外部中断的理解