请求参数绑定

package com.igeek.boot.controller;

import com.igeek.boot.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 测试接口的工具
 * 1.postman
 * 2.APIfox
 *
 * 测试接口的文档
 * 1.Swagger 在线文档
 * 2.Knife4j 离线文档
 *
 * @author chemin
 * @since 2024/6/23
 *
 * 参数注解
 * 1.@PathVariable  路径变量
 * 2.@RequestParam  获取简单类型   @RequestPart获取上传的文件类型  获取请求参数
 * 3.@RequestBody   从当前的请求中获取请求体,并将其从json数据格式转换成Java对象
 * 4.@RequestHeader 获取请求头
 * 5.@CookieValue   获取Cookie值
 * 6.@RequestAttribute 获取request请求作用域属性
 */
@Controller
public class ParamController {

    /**
     * 1.@PathVariable 路径变量
     * 语法格式: /url/{key1}/{key2} 与 注解@PathVariable("key1")、@PathVariable("key2")
     *     1.1 接收单个路径变量  {占位符} 必须要与 key一致
     *     1.2 批量接收路径变量  @PathVariable Map
     * Postman测试地址: GET  http://localhost:8080/get/101/张三
     * 使用场景:通过ID查询数据、根据ID删除数据等
     */
    @GetMapping("/get/{id}/{name}")
    @ResponseBody
    public Map<String,Object> testPathVariable(
            @PathVariable(value = "id" , required = false)Integer id,
            @PathVariable(value = "name" , required = false)String name,
            @PathVariable Map<String, String> valueMap
    ){
        Map<String,Object> map = new HashMap<>();
        map.put("id" , id);
        map.put("name" , name);
        map.put("valueMap" , valueMap);
        return map;
    }

    /**
     * 获取请求参数
     * 2.@RequestParam获取简单类型   @RequestPart获取上传的文件类型
     * 情况一:
     * url?key1=value1&key2=value2
     * Postman测试地址:POST http://localhost:8080/add?name=zs&age=18
     * Params选项卡 -> 填写Query Params数据
     *
     * 情况二:
     * Postman测试地址:POST http://localhost:8080/add
     * Body选项卡 -> x-www-form-urlencoded -> 填写数据
     *
     * 情况三:考虑到文件上传
     * Postman测试地址:POST http://localhost:8080/add
     * Body选项卡 -> form data -> 填写数据
     *
     * 使用场景:页面中使用表单数据提交都可以,更常见于前后端不分离的项目;
     * @RequestParam 或者 @RequestPart 可写可不写
     */
    @PostMapping("/add")
    @ResponseBody
    public Map<String,Object> testRequestParam(
            @RequestParam(name = "name" , required = false , defaultValue = "")String name,
            @RequestParam(name = "age" , required = false , defaultValue = "18")int age,
            @RequestPart(name = "pic")MultipartFile file
    ){
        Map<String,Object> map = new HashMap<>();
        map.put("name" , name);
        map.put("age" , age);
        map.put("file" , file.getOriginalFilename());
        return map;
    }


    /**
     * 注解@ResponseBody,一般用于类上(当前类中所有方法都返回json数据格式),或者方法上(当前方法返回json数据格式),将Java对象转成json数据
     * 注解@RequestBody,一般用在方法的形参列表上,将json数据转成Java对象
     *
     * 问题:GET? POST?  搭配@RequestBody可以使用
     * 答案:POST搭配@RequestBody可以使用
     * 请求中包含:请求行 、 请求头 、 请求体
     * GET  请求  请求行GET  /body?username=zs HTTP/1.1  请求头User-Agent: Mozilla/5.0
     * POST 请求  请求行POST /body HTTP/1.1  请求头User-Agent: Mozilla/5.0  请求体{"username":"李思思","password":"123"}
     *
     * 3.@RequestBody 从当前的请求中获取请求体,并将其从json数据格式转换成Java对象
     * Postman测试地址:POST http://localhost:8080/body
     * Body选项卡 -> raw JSON ->  {"username":"章撒","password":"123123"}
     *
     * 使用场景:适用于前后端分离
     *
     * 常见客户端错误代码
     * 1.GET方式+@ResponseBody   报错:400 Required request body is missing
     * 2.@PostMapping+Get方式提交 报错:405 Method Not Allowed
     * 3.x-www-form-urlencoded -> 表单数据  报错:415 Unsupported Media Type
     */
    @PostMapping("/body")
    @ResponseBody
    public Map<String,Object> testRequestBody(@RequestBody User user){
        Map<String,Object> map = new HashMap<>();
        map.put("username" , user.getUsername());
        map.put("password" , user.getPassword());
        return map;
    }

    /**
     * 请求中包含:请求行 、 请求头 、 请求体
     * GET  请求  请求行GET  /body?username=zs HTTP/1.1  请求头User-Agent: Mozilla/5.0
     * POST 请求  请求行POST /body HTTP/1.1  请求头User-Agent: Mozilla/5.0  请求体{"username":"李思思","password":"123"}
     *
     * 4.@RequestHeader 获取请求头
     * 等价于 request.getHeader("token")
     * Postman测试地址:GET http://localhost:8080/header
     * Headers选项卡 -> 添加token数据
     *
     * 使用场景:后续发送请求中必须携带token令牌
     */
    @GetMapping("/header")
    @ResponseBody
    public Map<String,Object> testRequestHeader(
            HttpServletRequest request,
            @RequestHeader(value = "User-Agent" , required = true) String userAgent,
            @RequestHeader(value = "Host" , required = true) String host,
            @RequestHeader(value = "token" , required = false , defaultValue = "") String token
    ){
        String t = request.getHeader("token");
        Map<String,Object> map = new HashMap<>();
        map.put("User-Agent" , userAgent);
        map.put("Host" , host);
        map.put("token" , token);
        map.put("t" , t);
        return map;
    }

    /**
     * 客户端的存储技术
     * Cookie缓存:浏览足迹、token等
     * LocalStorage本地存储:浏览足迹、token等
     * SessionStorage会话存储:登陆者头像、名称等
     *
     * 5.@CookieValue 获取Cookie值
     * Postman测试地址:GET http://localhost:8080/cookie
     * 右边的Cookies ->  Add domain  localhost  -> Add Cookie ->  Cookie_1=value; Path=/; Expires=Mon, 23 Jun 2025 08:39:21 GMT;
     *
     * 使用场景:发送请求携带cookie数据等
     */
    @GetMapping("/cookie")
    @ResponseBody
    public Map<String,Object> testGetCookie(
            @CookieValue("username") String username
    ){
        Map<String,Object> map = new HashMap<>();
        map.put("username" , username);
        return map;
    }

    /**
     * 作用域:上下文作用域     ->    会话作用域    ->  请求作用域       ->  当前页作用域
     * 后端: ServletContext      HttpSession    HttpServletRequest
     * 前端: applicationScope    sessionScope    requestScope        pageScope
     *
     * 6.@RequestAttribute 获取request请求作用域属性
     * 6.1 添加请求域数据 HttpServletRequest  Model  ModelMap
     * 6.2 获取请求域数据 @RequestAttribute("key")
     *
     * Postman测试地址:GET http://localhost:8080/setAttr
     * 使用场景:前后端不分离项目中,后端的数据传递至前端进行使用,将数据存储至作用域
     */
    @GetMapping("/setAttr")
    public String testSetRequestAttribute(
            HttpServletRequest request,
            Model model,
            ModelMap modelMap
    ){
        request.setAttribute("requestAttr" , "value1");
        model.addAttribute("modelAttr" , "value2");
        modelMap.addAttribute("modelMapAttr" , "value3");
        //请求转发,携带请求域中的数据
        return "forward:getAttr";
    }

    @GetMapping("/getAttr")
    @ResponseBody
    public Map<String,Object> testGetRequestAttribute(
        @RequestAttribute("requestAttr") String requestAttr,
        @RequestAttribute("modelAttr") String modelAttr,
        @RequestAttribute("modelMapAttr") String modelMapAttr
    ){
        Map<String,Object> map = new HashMap<>();
        map.put("requestAttr" , requestAttr);
        map.put("modelAttr" , modelAttr);
        map.put("modelMapAttr" , modelMapAttr);
        return map;
    }

    //@ModelAttribute 请求域中变量
    //@MatrixVariable 矩阵变量    /userList.jsp;jessionId=xxxxx

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值