一、springboot处理http请求的过程
1、客户端发起HTTP请求,经过网络传输到服务器
HTTP请求通常由浏览器、Postman、curl或其他HTTP客户端发起,客户端的HTTP请求通过网络(通常是TCP/IP协议)传输到服务器,这个请求首先会到达Spring Boot应用的端口
2、服务器接收请求
服务器上的网络堆栈处理传入的TCP/IP包,并将其传递给服务器软件。在Spring Boot应用中,嵌入式的Tomcat、Jetty或Undertow服务器负责监听HTTP端口并接收请求。
也就是说到达springboot的程序之后,首先是由tomcat接收并处理请求的,一般这个tomcat是springboot内置的。
3、 Servlet容器(tomcat)处理请求
嵌入式的Servlet容器(如Tomcat)接收到HTTP请求后,会将请求解析成HttpServletRequest
对象。这个对象封装了请求行、请求头和请求体等信息。这个过程是在Tomcat的内部实现的,遵循Servlet规范,不涉及到Spring Boot的具体代码。
4、查找对应的Servlet然后DispatcherServlet处理请求
Tomcat Servlet容器会根据HttpServletRequest对象的信息(例如URL、HTTP方法类型等)去寻找已经注册到容器中的对应的Servlet,找到对应的DispatcherServlet
后,Tomcat将把HttpServletRequest对象传递给它。DispatcherServlet
接收到HttpServletRequest后,将会根据其中的URL信息,去寻找在Spring应用程序中注册的对应的Controller和处理的方法。
5、Controller处理请求
找到对应的Controller和方法后,DispatcherServlet
将调用这个方法,并传递HttpServletRequest中的信息。到达controller接口之后,进入controller中自己的处理逻辑,然后最终生成返回结果。
- 视图解析:如果控制器返回的是视图名称,Spring会使用
ViewResolver
来解析视图并生成HTML内容。 - 序列化数据:如果控制器返回的是对象(如JSON),Spring会使用
HttpMessageConverter
将对象序列化为JSON或XML格式。
6、返回响应给客户端
DispatcherServlet
生成HttpServletResponse
对象,包含响应的状态码、头部和体。Servlet容器(如Tomcat)将HttpServletResponse
对象转换为原始的HTTP响应,并通过网络传输回客户端。
7、客户端接收响应
客户端收到HTTP响应,解析响应行、响应头和响应体,并根据状态码和内容采取相应的动作。例如:
- 浏览器渲染HTML内容或显示JSON数据。
- API客户端解析JSON数据并进一步处理。
二、关于tomcat与servlet
Spring Boot处理HTTP请求的整个过程。在这个过程中,Spring Boot的自动配置让开发者不需要关心底层的处理细节,可以专注于编写业务代码。
而tomcat主要就是负责处理http请求的。Spring Boot默认使用内嵌的Tomcat服务器。这意味着Spring Boot应用启动时,它会自动启动一个Tomcat实例,并且该实例会根据Spring Boot的配置文件来决定监听哪个端口。
Tomcat作为Servlet容器,负责管理所有部署在它上面的应用及其Servlet对象。而servlet,在每个Spring Boot应用中(也就是每个服务中),通常会有一个DispatcherServlet
对象,它是负责处理所有HTTP请求的核心组件。每个Spring Boot应用相当于一个独立的服务,运行在Tomcat上。也就是说每一个springboot服务对应一个servlet 对象,这个servlet对象由tomcat统一管理。每个应用的DispatcherServlet
是独立的,处理与该应用相关的所有HTTP请求。
所以总结一下:
- 一个Spring Boot服务对应一个Servlet对象,即
DispatcherServlet
。 - 服务器(Tomcat)上可以运行多个Spring Boot服务,因此会有多个
DispatcherServlet
对象。 - Tomcat负责管理这些Servlet对象,包括它们的创建、初始化、请求处理、和销毁,并确保请求被正确路由到相应的Servlet对象。
这里面只简答介绍一下对应关系,详细了解可以再自行查询。
所以流程就是:
http请求 ----> tomcat ---> 对应servlet类 ----> 再到对应接口
三、springboot对应http请求映射 (Request Mapping)
前面简单说了 http 对应的方法类型常用的有 GET、POST、PUT、DELETE 等方法,这些方法在springboot中也帮我们定义好了对应的注解来映射这些方法。
- @GetMapping:用于处理 HTTP GET 请求。
- @PostMapping:用于处理 HTTP POST 请求。
- @PutMapping:用于处理 HTTP PUT 请求。
- @DeleteMapping:用于处理 HTTP DELETE 请求。
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
上面的代码中,指定请求路径为 /api/hello,指定请求方法为 GET。
还有一个常用注解是@RequestMapping 注解,这个注解 value 属性来指定请求路径,使用 method 属性来指定请求方法,例如:
@RestController
@RequestMapping("/api")
public class MyController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "Hello, World!";
}
}
关于这些注解的详细使用也不再多说,比较简单会用即可,详细可再自行搜索。