天天看点

Spring Boot:处理HTTP请求

​Spring Boot​

​​非常适合​

​Web​

​​应用程序开发,可以使用嵌入式​

​Tomcat​

​​、​

​Jetty​

​​、​

​Undertow​

​​或​

​Netty​

​​创建一个​

​HTTP​

​​服务器,大多数​

​Servlet Web​

​​应用程序使用​

​spring-boot-starter-web​

​​模块来快速启动和运行,还可以选择使用​

​spring-boot-starter-webflux​

​​模块构建响应式(​

​Reactive​

​​)​

​Web​

​应用程序。

​Spring Web MVC​

​​框架(通常称为​

​Spring MVC​

​​)是一个丰富的模型(​

​Model​

​​)、视图(​

​View​

​​)、控制器(​

​Controller​

​​)​

​Web​

​​框架,​

​Spring MVC​

​​允许创建特殊的​

​Bean​

​​(控制器,使用​

​@Controller​

​​或​

​@RestControllerbean​

​​注解的类)来处理传入的​

​HTTP​

​​请求,控制器中的方法通过使用​

​@RequestMapping​

​​注解映射到对应的​

​HTTP​

​请求。

Servlet Web模块

​spring-boot-starter-web​

​​模块依赖​

​spring-web​

​​模块和​

​spring-webmvc​

​模块。

Spring Boot:处理HTTP请求
  • ​Spring Web​

    ​​提供了核心的​

    ​HTTP​

    ​集成,包括一些方便的​

    ​Servlet​

    ​过滤器、​

    ​Spring HTTP​

    ​调用程序、与其他​

    ​Web​

    ​框架和​

    ​HTTP​

    ​技术(如​

    ​Hessian​

    ​、​

    ​Burlap​

    ​)集成的基础结构。
  • Spring Boot:处理HTTP请求
  • ​Spring Web MVC​

    ​​是​

    ​Spring MVC​

    ​的一个实现,​

    ​Spring Web MVC​

    ​依赖于​

    ​Spring Web​

    ​。如果不使用​

    ​Spring MVC​

    ​,但需要使用​

    ​Spring​

    ​支持的其他与​

    ​Web​

    ​相关的技术,那么应该依赖​

    ​Spring Web​

    ​。
  • Spring Boot:处理HTTP请求
    Spring Boot:处理HTTP请求

​spring-web​

​​模块提供了大多数处理​

​HTTP​

​请求的注解。

Spring Boot:处理HTTP请求

​spring-context​

​​模块提供了​

​Controller​

​注解。

Spring Boot:处理HTTP请求

​HTTP​

​​请求方法的​

​Java​

​​枚举类​

​RequestMethod​

​​,旨在与​

​RequestMapping​

​​注解的​

​method​

​属性一起使用。

package org.springframework.web.bind.annotation;

public enum RequestMethod {

  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}      

演示代码

​pom.xml​

​:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
    </parent>

    <packaging>jar</packaging>

    <groupId>com.kaven</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>springboot</name>
    <description>springboot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>      

启动类:

package com.kaven.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(SpringbootApplication.class);
        application.run(args);
    }
}      

GET

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/get1", method = RequestMethod.GET)
    public String get1() {
        return "GET1";
    }

    @GetMapping(path = "/get2")
    public String get2() {
        return "GET2";
    }
}      

​@RequestMapping(path = "/get1", method = RequestMethod.GET)​

​​和​

​@GetMapping(path = "/get2")​

​​是一样的效果,都是在控制器中定义一个处理​

​GET​

​​请求的方法,只是处理请求的路径不同而已。启动应用,使用​

​Postman​

​进行测试:

Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

POST

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/post1", method = RequestMethod.POST)
    public String post1() {
        return "POST1";
    }

    @PostMapping(path = "/post2")
    public String post2() {
        return "POST2";
    }
}      
Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

DELETE

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/delete1", method = RequestMethod.DELETE)
    public String delete1() {
        return "DELETE1";
    }

    @DeleteMapping(path = "/delete2")
    public String delete2() {
        return "DELETE2";
    }
}      
Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

PUT

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/put1", method = RequestMethod.PUT)
    public String put1() {
        return "PUT1";
    }

    @PutMapping(path = "/put2")
    public String put2() {
        return "PUT2";
    }
}      
Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

PATCH

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/patch1", method = RequestMethod.PATCH)
    public String patch1() {
        return "PATCH1";
    }

    @PatchMapping(path = "/patch2")
    public String patch2() {
        return "PATCH2";
    }
}      
Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

HEAD

​HEAD​

​​请求类似于​

​GET​

​请求,只不过返回的响应中没有具体的内容,用于获取请求头。

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/head1", method = RequestMethod.HEAD)
    public String head1(@RequestHeader Map<String, String> header) {
        StringBuilder builder = new StringBuilder();
        for(Map.Entry entry : header.entrySet()) {
            builder.append(entry.getKey() + " : " + entry.getValue() + "\n");
        }
        builder.append("head1\n");
        System.out.println(builder);
        return builder.toString();
    }

    @GetMapping(path = "/head2")
    public String head2(@RequestHeader Map<String, String> header) {
        StringBuilder builder = new StringBuilder();
        for(Map.Entry entry : header.entrySet()) {
            builder.append(entry.getKey() + " : " + entry.getValue() + "\n");
        }
        builder.append("head2\n");
        System.out.println(builder);
        return builder.toString();
    }
}      

虽然返回了字符串,但客户端接收到的还是空的响应。

Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求
Spring Boot:处理HTTP请求

OPTIONS

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/options1", method = RequestMethod.OPTIONS)
    public String options1() {
        return "OPTIONS1";
    }
}      

TRACE

package com.kaven.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HTTPMethodController {
    @RequestMapping(path = "/trace1", method = RequestMethod.TRACE)
    public String trace1() {
        return "TRACE1";
    }
}