HTTP协议讲解
概念: Hyper Text ** Transfer Protocol 超文本 传输协议 ,规定了浏览器和服务器之间的数据传输规则

特点
- 基于TCP协议,面向连接,安全
- 基于请求-响应模型的,一次请求对应一次响应
- 无状态的,对于事物没有记忆能力,每次请求-响应都是独立的
-
- 缺点:多次请求间不能共享数据
-
- 优点: 响应速度快
请求协议 常见请求字段

- Get方式:请求参数在请求行中,没有请求体,请求大小在浏览器中是有限制的。
- Post方式:请求参数在请求体中,请求大小没有限制。
请求数据获取
- web服务器(Tomcat)对http协议的请求数据进行了解析,并进行了封装(HttpServeletRequest),在调用controller方法的时候自动传递给了该方法,因此我们不必直接对原始协议进行操作。

代码示例:
package com.huohuo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
@RequestMapping(value = "/request")
public String request(HttpServletRequest request) {
// 获取请求方式
String method = request.getMethod();
// 获取请求路径
String requestURL = request.getRequestURL().toString();
String requestURI = request.getRequestURI(); // 是资源访问路径
// 获取请求协议
String protocol = request.getProtocol();
// 获取请求参数 - name, age
String name = request.getParameter("name");
String age = request.getParameter("age");
// 获取请求头 - Accept
String accept = request.getHeader("Accept");
return "OK<br/>" +
"method:" + method + "<br/>" +
"requestURL:" + requestURL + "<br/>" +
"requestURI:" + requestURI + "<br/>" +
"protocol:" + protocol + "<br/>" +
"name:" + name + "<br/>" +
"age:" + age + "<br/>" +
"accept:" + accept + "<br/>";
}
}
启动后访问localhost:8080/request?name=huohuo&age=18

响应协议 以下是常见的响应状态码:



web服务器对 http ** 协议的响应数据进行了封装(HttpServeletResponse),并在调用Controller方法的时候传递了该方法,这就使得程序员不必对协议直接进行操作,让web开发更加便捷。
使用response或spring对象进行响应
@RequestMapping("/response")
// 第一种方式,响应体是字符串,会自动设置响应头 Content-Type: text/plain;charset=UTF-8
public void Response(HttpServletResponse response) throws IOException {
// 设置响应状态码
response.setStatus(HttpServletResponse.SC_OK); // 200
// 设置响应头
response.setHeader("name", "huohuo");
// 设置响应体
// 会抛出 IOException, 因为 response.getWriter() 获取的流,是和 response 关联的,
response.getWriter().write("<h1> hello response </h1>");
}
// 使用spring中提供的方式,封装对象返回
@RequestMapping("/response2")
// 这是第二种方式,返回 ResponseEntity 对象,会自动设置响应头 Content-Type: text/plain;charset=UTF-8,也可以手动设置
public ResponseEntity<String> response2(HttpServletRequest request) {
return ResponseEntity
.status(200)
.header("name2", "huohuo2")
.body("<h1> hello response2 </h1>");
}
注:响应头和响应状态码如果没有特殊要求的话,通常不手动设定,服务器会根据请求处理的逻辑自动设置状态码和头
完
致谢:本文参考黑马程序员的视频。 https://www.bilibili.com/video/BV1yGydYEE3H/?vd_source=1b8f9bfb1d0891faf1c70d7678ae56db