Spring Boot基础功能:请求
1 常用注解
1.1 @PathVariable 路径变量
@PathVariable
注解与Restful风格路径匹配,可以用于方法的参数上,用于将URL中的变量绑定到方法的参数上。如果方法参数是一个Map<String, String>将会包含路径中所有的变量与值。
@RequestMapping("/hospitals/{hsopitalID:[1-9]\d+}/departments/{departmentID:[1-9]\d+}")
@ResponseBody
public Map<String, Object> getHospitalDepartments(@PathVariable("hospitalID") Long hospitalID,
@PathVariable("departmentID") Long departmentID,
@PathVariable Map<String, String> parameters) {
Map<string, Object> out = new HashMap<>();
out.put("hospitalId", hospitalID);
out.put("departmentId", departmentID);
out.put("all-parameters", parameters);
return out;
}
以上路径使用了正则表达式限制了路径参数的取值范围。
1.2 @RequestHeader 获取请求头
这个注解用于获取请求头header中的信息,可以用于SpringMVC也可以用于WebFlux,如果方法参数是一个Map<String, String>将会包含所有的请求头与值.
@RequestMapping("/users")
public Map<String, Object> getUser(@RequestHeader("Content-Type") String contentType,
@RequestHeader Map<String, Object> headers) {
Map<String, Object> out = new HashMap<>();
out.put("Content-Type", contentType);
out.put("all-headers", headers);
return out;
}
常用请求头
名称 | 说明 | 常见值 |
---|---|---|
method | Web请求方法 | GET/POST/PUT/PATCH/DELETE/OPTIONS/TRACE |
cookie | 页面中设置的cookie值 | |
Content-Type | 请求体的数据类型 | |
Content-Length | 请求体的数据长度 | |
Host | 所请求的服务器地址 | |
Refferrer | 发送请求页面的URI | |
User-Agent | 显示客户端的身份标识 | Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) |
Date | 发送该请求的日期和时间 | |
Connection | 链接方式 | keep-alive, close |
Accept-Encoding | 浏览器可以处理的压缩编码类型 | gzip, deflate, br |
Accept | 浏览器可以处理的内容类型 | |
Accept-charset | 浏览器可以处理的字符集 | |
If-Modified-Since | 协商缓存,取自 Response haders 中的 Last-Modified 字段。服务器通过对比这两个字段判断缓存是否有效 | |
If-None-Match | 协商缓存,取自 Response Headers 中的 E-tag 字段。服务器通过对比这两个字段判断缓存是否有效 |
1.3 @RequestParam 获取请求参数
主要用于获取请求参数名称,设置参数是否可有可无以及默认值。如果方法参数是一个Map<String, String>将会包含所有的请求参数与值.
@RequestMapping("/users")
public Integer createUser(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam(value="avatar", defaultValue="avatar.jpg", required=true) String avatar,
@RequestParam Map<String, String> params) {
}
使用application/x-www-form-urlencoded
传递数据时,需要使用@RequestParam
获取数据
1.4 @CookieValue 获取Cookie值
主要用于cookie中的值,用法和@RequestParam
注解一样。
@RequestMapping("/users")
public Integer createUser(@CookieValue("id") String ID,
@CookieValue("username") String username,
@CookieValue Cookie cookies) {
}
1.5 @RequestAttribute 获取request请求域中的值
@RequestMapping("/goto")
public String ForwardTest(HttpServletRequest req) {
req.setAttribute("code", 500);
req.setAttribute("message", "内部错误");
return "forward:/errors";
}
@RequestMapping("/errors")
@ResponseBody
public Map<String, Object> ErrorTest(@RequestAttribute("code") Integer code,
@RequestAttribute("message") String message,
HttpServletRequest req) {
Map<String, Object> out = new HashMap<>();
out.put("code", code);
out.put("message", message);
out.put("requests", req);
return out;
}
1.6 @RequestBody 获取请求体中的数据
@RequestBody
注解用于获取HTTP请求体中的数组,并将其转换为指定的对象.
public class User {
private Long id;
private String UserName;
private String Email;
....
}
@PostMapping("/users")
Public ResponseEntity<User> createUser(@ReponseBody User user, @ResponseBody String jsonContent) {
}
使用application/json
传递数据时,需要使用@RquestBody获取数据
1.7 使用矩阵变量获取参数
矩阵变量的请求格式
/userMsg/msg;name=java;age=22;pet=dog,cat,bird
启用矩阵变量, 建一个config类并且实现WebMvcConfigurer接口,然后重写configurePathMatch方法:
@Configuration(proxyBeanMethods=false)
public class WebConfig implements WebMvcConfigurer {
@Override
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
读取矩阵变量
@RequestMapping(value = "userMsg/{path}")
public Map getUserMsg(@MatrixVariable("name") String userName,
@MatrixVariable("age") int userAge,
@MatrixVariable("pet") List<String> pet,
@PathVariable("path") String path){
Map<String,Object> map = new HashMap<>();
map.put("name",userName);
map.put("age",userAge);
map.put("pet",pet);
map.put("path",path);
System.out.println(userName+" "+userAge+" "+pet);
return map;
}
1.8 请求转发与请求重定向
/**
* 请求重定向
* 以重定向的方式跳转到这个页面@return
*/
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/hello.html";
}
/**
* 请求转发
* 以请求转发的方式跳转到这个页面@return
*/
@RequestMapping("/forward")
public String forward(){
return "forward:/hello.html";
}
2 获取内容类型
在@RequestMapping
注解中指定consumes
属性可以指定请求类型,即Content-Type。指定produces
属性可以指定返回类型,即accept
。
2.1 读取XML内容
引入对应的包:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.7</version>
</dependency>
定义一个请求对象
package com.juhedao.controller.request;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
@JacksonXmlRootElement(localName = "school")
@Data
public class UserXmlRequest {
@JacksonXmlProperty(localName="id")
private Integer ID;
@JacksonXmlProperty(localName="username")
private String username;
@JacksonXmlProperty(localName="avatar")
private String avatar;
}
在Controller里读取
@PostMapping(value = "/test", produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<User> updateUser(@RequestBody UserXmlRequest userRequest) {
}
2.2 读取Json类型
@PostMapping(value = "/test", produces = "application/json", consumes = "application/json)
public Model getUser(@ResponseBody Model model) {
return model;
}
2.3 上传文件
@PostMapping("/uploads")
public function uploads(@RequestParam("file") MultipartFile file) {
}
3 使用HttpServletRequest处理请求
HttpServletRequest
是Servlet Api中的一个接口,它代表客户端的HTTP请求。在Spring Boot框架中,HttpServletRequest
可以很方便地获取Http请求的所有信息,包括请求方式、请求头、请求体等。
使用
@RestController
public class TestController {
@RequestMapping("/test")
public String test(HttpServletRequest request){
// some code here
return "success";
}
}
3.1 获取请求信息
@RequestMapping("/test")
public String test(HttpServletRequest request){
// 获取请求方法
String method = request.getMethod();
System.out.println("请求方法:" + method);
// 获取请求URL
StringBuffer url = request.getRequestURL();
System.out.println("请求URL:" + url.toString());
// 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
// 获取请求头
String userAgent = request.getHeader("User-Agent");
System.out.println("User-Agent:" + userAgent);
// 获取请求体
BufferedReader reader = request.getReader();
StringBuilder stringBuilder = new StringBuilder();
char[] chars = new char[1024];
int len;
while ((len = reader.read(chars)) != -1) {
stringBuilder.append(chars, 0, len);
}
String requestBody = stringBuilder.toString();
System.out.println("请求体:" + requestBody);
return "success";
}
3.2 实现文件上传
@PostMapping("/upload")
public String upload(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
String fileName = file.getOriginalFilename();
String filePath = "C:/file/upload/";
File dest = new File(filePath + fileName);
file.transferTo(dest);
return "上传成功";
}
3.3 请求转发
@RequestMapping("/test1")
public String test1(HttpServletRequest request){
request.setAttribute("name", "张三");
return "forward:/test2";
}
@RequestMapping("/test2")
public String test2(HttpServletRequest request){
String name = (String) request.getAttribute("name");
System.out.println(name);
// some code here
return "success";
}
3.4 请求重定向
@RequestMapping("/test3")
public String test3(HttpServletRequest request){
return "redirect:/test4";
}
@RequestMapping("/test4")
public String test4(HttpServletRequest request){
// some code here
return "success";
}
发表回复