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 }
请求参数绑定
最新推荐文章于 2024-11-02 12:56:04 发布