相信很多人在开发时,大多是controller到service到mapper,但是用户在点击触发一个事件时,这个请求到底怎么过来的,怎么就找到了你写的这个接口呢。鉴于我以前同时写前端和后端,所以我想简单概述下一个基本的流程
1. 客户端事件触发
- 用户交互:用户在浏览器中点击网页上的按钮触发交互事件。这通常在HTML文档中表现为一个
<button>
或其他可交互元素。
<button id="myButton">Submit</button>
- JavaScript事件监听器:
- 在HTML页面上通过JavaScript为按钮添加监听器,监听
click
事件。 - 可以通过直接在元素上添加事件或在脚本块中动态添加。
- 在HTML页面上通过JavaScript为按钮添加监听器,监听
document.getElementById('myButton').addEventListener('click', function() {
// 获取必要的数据或元素值,如表单输入
var inputValue = document.getElementById('inputField').value;
// 发起请求
sendRequest(inputValue);
});
2. 构造HTTP请求
- 初始化请求:创建HTTP请求对象,可以使用
XMLHttpRequest
对象或现代浏览器中的fetch
API。
function sendRequest(data) {
fetch('/api/endpoint', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ data: data })
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch((error) => console.error('Error:', error));
}
- 设置请求参数:
- 指定请求方法(GET, POST等)。
- 设置请求头,例如
Content-Type
(通常为application/json
或application/x-www-form-urlencoded
)。 - 提供请求体(例如JSON数据)或URL参数。
3. 网络层处理
-
DNS解析:浏览器会根据请求的URL进行DNS解析,将域名(如
example.com
)转换为目标服务器的IP地址。涉及以下步骤:- 浏览器检查自身缓存。
- 若无结果,查询操作系统的缓存。
- 否则通过路由器和ISP请求DNS服务器进行递归查询。
-
建立连接:
- TCP连接:通过三次握手确定与服务器之间的可靠连接。(想了解自己去查,我也不甚了解,这个网络运维方面工作更多一些)
- SSL/TLS握手(在HTTPS连接时):客户端与服务器之间进行加密会话的协商,涉及证书验证和会话密钥生成。
4. 请求到达Web服务器
-
Web服务器接收:服务器软件(如Apache、Nginx)接受到浏览器发来的HTTP请求。
-
初步处理和路由:Web服务器可能会基于服务器配置进行请求的初步处理,如:
- 检查防火墙规则。
- 路由请求到正确的应用(反向代理的情况)。
5. 应用服务器处理请求
-
请求转发:如果是Java web应用程序,Web服务器通常会将请求转发到一个应用服务器(如Apache Tomcat)。
-
应用服务器处理:应用服务器负责执行Java应用程序代码,通过Serlvet容器来处理请求。
6. DispatcherServlet拦截请求
- Spring框架的作用:
DispatcherServlet
充当前端控制器,所有进来的请求最初都被这个Servlet捕获。- 它通过查找映射和配置(如XML或注解)来识别目标控制器。
7. 请求映射到控制器
- 映射查找:
DispatcherServlet
通过查找HandlerMapping
来确定应该调用哪个控制器方法。- 使用注解(如
@RequestMapping
)或XML配置匹配URL和HTTP方法。
@Controller
public class MyController {
@PostMapping("/api/endpoint")
public ResponseEntity<MyResponse> handleRequest(@RequestBody MyData data) {
// 业务处理
return ResponseEntity.ok(new MyResponse("Success"));
}
}
- 参数解析:
- 使用Spring的
HandlerMethod
能力自动解析和绑定请求中的参数、头信息、和请求体到方法参数。
- 使用Spring的
8. 控制器执行
- 执行处理逻辑:
- 控制器方法调用应用程序的业务逻辑,通常通过调用服务层组件进行更复杂的操作。
- 如果涉及数据库,可能会通过DAO(数据访问对象)模式访问数据库。
9. 生成和返回响应
- 处理结果:
- 控制器返回业务逻辑处理后的结果,通常封装成某种响应对象。
- 如果结果是视图名,
DispatcherServlet
通过视图解析器为客户端生成HTML页面。 - 对于REST服务,通常返回JSON格式数据。
10. HTTP响应构造
- 响应生成:
- Spring框架会构造标准的HTTP响应,设置合适的状态码、响应头和响应体。
- Servlet容器(如Tomcat)负责最终的HTTP响应构建和发送。
11. 返回给客户端
- 传回响应:应用服务器将响应传递给Web服务器,Web服务器再将其返回给客户端浏览器。
12. 客户端处理响应
-
处理响应:
- 浏览器接收到HTTP响应后,根据响应头中的
Content-Type
决定解析方式。 - 如果是JSON,JavaScript可以解析并更新页面上的内容。
- 如果是HTML,浏览器会直接渲染页面。
- 浏览器接收到HTTP响应后,根据响应头中的
-
页面更新:
- 基于接收到的数据,可能会调用JavaScript来更新网页的DOM内容,修改界面元素,或者显示用户提示。以下是一个简单的例子:
fetch('/api/endpoint')
.then(response => response.json())
.then(data => {
document.getElementById('responseMessage').innerText = data.message;
});
这一流程跨越了多个技术层次,包括浏览器端的用户交互和脚本执行,网络协议与传输,服务器端的Web与应用服务器交互,以及Java应用框架(如Spring)的内部操作逻辑。每个步骤都有其独特的技术细节与实现逻辑,以确保请求的正确处理和响应。
标签:Web,HTTP,请求,流程,基础,响应,浏览器,data From: https://www.cnblogs.com/jhfnewstart/p/18610705