计算机系统应用教程网站

网站首页 > 技术文章 正文

Spring Boot 请求处理详解 & IDEA Http Client

btikc 2024-10-13 01:50:21 技术文章 12 ℃ 0 评论

在构建现代 Web 应用时,Spring Boot 提供了强大的请求处理功能。本文将深入探讨 Spring Boot 中的各种请求处理方式,包括 @RequestParam、@RequestBody、@RequestHeader、@CookieValue、HttpEntity,以及如何使用原生 Servlet API 获取请求对象。此外,我们还将讨论 @ResponseBody 的使用,以及文件上传和下载的实现。

1. @RequestParam

@RequestParam 注解用于处理请求参数。它将 URL 中的查询参数映射到方法的参数。

示例

@GetMapping("/login")
public String login(@RequestParam("name") String name, @RequestParam("password") String password) {
    System.out.println(String.format("用户名:%s\t\t密码:%s", name, password));
    return "OK";
}
### 1.使用普通变量,接收请求参数
GET {{host}}/user/login?name=ijunfu&password=123456
accept: application/json

2. @RequestBody

@RequestBody 注解用于将请求体中的 JSON 数据转换为 Java 对象。它通常与 POST 或 PUT 请求一起使用。

示例

@Data
@ToString
public class LoginForm implements java.io.Serializable {

    private static final long serialVersionUID = 291217L;

    private String name;

    private String password;
}
@GetMapping("/login2")
public String login2(@RequestBody LoginForm form) {
  System.out.println(form);
  return "OK";
}
GET {{host}}/user/login2
Content-Type: application/json

{
  "name": "ijunfu",
  "password": "123456"
}

3. @RequestHeader

@RequestHeader 注解用于获取请求头信息。

示例

@GetMapping("/login3")
public String login3(@RequestBody LoginForm form, @RequestHeader("type") Integer type) {
    System.out.println(String.format("type=%d", type));
    System.out.println(form);
    return "OK";
}
GET {{host}}/user/login3
Content-Type: application/json
type: 1

{
  "name": "ijunfu",
  "password": "123456"
}

4. @CookieValue

@CookieValue 注解用于获取请求中的 Cookie。

示例

@GetMapping("/login4")
public String login4(@RequestBody LoginForm form, @CookieValue("type") String type) {
    System.out.println(String.format("type=%s", type));
    System.out.println(form);
    return "OK";
}
GET {{host}}/user/login4
Content-Type: application/json
Cookie: type=1

{
  "name": "ijunfu",
  "password": "123456"
}

5. HttpEntity

HttpEntity 是一个用于封装请求和响应体的类。它可以与 @RequestBody 和 @ResponseBody 一起使用。

示例

@GetMapping("/login5")
public String login5(HttpEntity<String> httpEntity) {

    HttpHeaders headers = httpEntity.getHeaders();

    List<MediaType> accept = headers.getAccept();
    MediaType contentType = headers.getContentType();

    System.out.println("客户接收类型:" + accept);
    System.out.println("请求体类型:"+contentType);

    String body = httpEntity.getBody();
    System.out.println("请求体:" + body);

    return "OK";
}
GET {{host}}/user/login5
Content-Type: application/json
Accept: application/json

{
  "name": "ijunfu"
}

6. 使用原生 Servlet API 获取请求对象

可以通过 HttpServletRequest 获取原生请求对象。

示例

@GetMapping("/login6")
public void login6(HttpServletRequest request, HttpServletResponse response) throws IOException {

    String name = request.getParameter("name");
    String password = request.getParameter("password");

    System.out.println(String.format("name=%s password=%s", name, password));

    response.getWriter().write("OK");
}
GET {{host}}/user/login6?name=ijunfu&password=123456

8. 文件上传

Spring Boot 支持文件上传,通常使用 MultipartFile。

示例

@GetMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    String filename = file.getOriginalFilename();
    System.out.println(filename);
    return "OK";
}
GET {{host}}/user/upload
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain

{ "author": "ijunfu", "mail": "ijunfu@163.com" }

------WebKitFormBoundary7MA4YWxkTrZu0gW--

9. 文件下载

可以通过设置响应头实现文件下载。

示例

@GetMapping("/download")
public ResponseEntity<UrlResource> download() throws MalformedURLException {
  UrlResource urlResource = new UrlResource("https://sf3-cdn-tos.toutiaostatic.com/img/user-avatar/caa4bd4f43a9131f8fcd4a85f0c5f87c~300x300.image");

  return ResponseEntity
    .ok()
    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=user-avatar.jpg")
    .body(urlResource);
}
GET {{host}}/user/download

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表