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;
}

常用请求头

名称说明常见值
methodWeb请求方法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";
}

发表回复

您的电子邮箱地址不会被公开。