HTTP协议入门
文章目录
- 1. 概述
- 2. 请求协议
- 2.1 Get 方式请求协议
- 2.2 POST 方式的请求
- 2.3 获取请求数据
- 3. 响应协议
- 3.1 响应数据格式
- 3.2 设置响应数据
1. 概述
概念 :Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
特点:
- 基于 TCP 协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP 协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求间不能共享数据
- 优点:速度快
2. 请求协议
请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头、请求体
2.1 Get 方式请求协议
- 请求行(以上图中红色部分) :HTTP请求中的第一行数据。由:
请求方式
、资源路径
、协议/版本
组成(之间使用空格分隔)- 请求方式:
GET
- 资源路径:
/brand/findAll?name=OPPO&status=1
- 请求路径:
/brand/findAll
- 请求参数:
name=OPPO&status=1
- 请求参数是以
key=value
形式出现 - 多个请求参数之间使用
&
连接
- 请求参数是以
- 请求路径和请求参数之间使用
?
连接
- 请求路径:
- 协议/版本:HTTP/1.1
- 请求方式:
- 请求头(以上图中黄色部分) :第二行开始,上图黄色部分内容就是请求头。格式为key: value形式
- http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。这样服务器在收到信息后,就可以知道是谁,想干什么了
- 常见的HTTP请求头有:
请求头 | 含义 |
---|---|
Host | 表示请求的主机名 |
User-Agent | 浏览器版本。 例如:Chrome浏览器的标识类似Mozilla/5.0 …Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Windows NT …)like Gecko |
Accept | 表示浏览器能接收的资源类型,如text/*,image/或者/*表示所有; |
Accept-Language | 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; |
Accept-Encoding | 表示浏览器可以支持的压缩类型,例如gzip, deflate等。 |
Content-Type | 请求主体的数据类型 |
Content-Length | 数据主体的大小(单位:字节) |
- 请求体 :存储请求参数
- GET请求的请求参数在请求行中,故不需要设置请求体
2.2 POST 方式的请求
- 请求行(以上图中红色部分):包含请求方式、资源路径、协议/版本
- 请求方式:POST
- 资源路径:/brand
- 协议/版本:HTTP/1.1
- 请求头(以上图中黄色部分)
- 请求体(以上图中绿色部分) :存储请求参数
- 请求体和请求头之间是有一个空行隔开(作用:用于标记请求头结束)
GET 请求和 POST 请求的区别
区别方式 | GET请求 | POST请求 |
---|---|---|
请求参数 | 请求参数在请求行中。 例:/brand/findAll?name=OPPO&status=1 | 请求参数在请求体中 |
请求参数长度 | 请求参数长度有限制(浏览器不同限制也不同) | 请求参数长度没有限制 |
安全性 | 安全性低。原因:请求参数暴露在浏览器地址栏中。 | 安全性相对高 |
2.3 获取请求数据
Web服务器 (Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest),并在调用Controller方法的时候传递给了该方法。这样,就使得程序员不必直接对协议进行操作,让Web开发更加便捷。
代码演示
@RestController
public class RequestController {
@RequestMapping("/request")
public String request(HttpServletRequest request){
//获取请求方式
String method = request.getMethod();
System.out.println("method = " + method);
//获取请求url地址(完整地址)
String url = request.getRequestURL().toString();
System.out.println("url = " + url);
//获取请求uri地址(资源访问路径)
String uri = request.getRequestURI();
System.out.println("uri ="+uri);
//获取请求协议
String protocol = request.getProtocol();
System.out.println("protocol = " + protocol);
//获取请求参数
String queryString = request.getQueryString();
System.out.println("queryString = " + queryString);
//获取请求头
String header = request.getHeader("User-Agent");
System.out.println("header = " + header);
return "success";
}
}
运行结果如下
3. 响应协议
3.1 响应数据格式
-
响应协议:服务器将数据以响应格式返回给浏览器。包括:响应行 、响应头 、响应体
-
响应行(以上图中红色部分):响应数据的第一行。响应行由
协议及版本
、响应状态码
、状态码描述
组成- 协议/版本:HTTP/1.1
- 响应状态码:200
- 状态码描述:OK
-
响应头(以上图中黄色部分):响应数据的第二行开始。格式为key:value形式
- http是个无状态的协议,所以可以在请求头和响应头中设置一些信息和想要执行的动作,这样,对方在收到信息后,就可以知道你是谁,你想干什么
- 常见的HTTP响应头有:
名称 | 说明 |
---|---|
Content-Type | 表示该响应内容的类型,例如 text/html,image/jpeg |
Content-Length | 表示该响应内容的长度(字节数) |
Content-Encoding | 表示该响应压缩算法,例如 gzip |
Cache-Control | 指示客户端应如何缓存,例如 max-age=300 表示可以最多缓存 300 秒 |
Set-Cookie | 告诉浏览器为当前页面所在的域设置 cookie |
- 响应状态码
状态码分类 | 说明 |
---|---|
1xx | 响应中 — 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略 |
2xx | 成功 — 表示请求已经被成功接收,处理已完成 |
3xx | 重定向 — 重定向到其它地方,让客户端再发起一个请求以完成整个处理 |
4xx | 客户端错误 — 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
5xx | 服务器端错误 — 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
关于响应状态码[[常用状态码大全]],我们先主要认识三个状态码,其余的等后期用到了再去掌握: |
200 ok
客户端请求成功404 Not Found
请求资源不存在500 Internal Server Error
服务端发生不可预期的错误
3.2 设置响应数据
Web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。这样,就使得程序员不必直接对协议进行操作,让Web开发更加便捷。
package com.itheima;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
public class ResponseController {
@RequestMapping("/response")
public void response(HttpServletResponse response) throws IOException {
//1.设置响应状态码
response.setStatus(401);
//2.设置响应头
response.setHeader("name","itcast");
//3.设置响应体
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.getWriter().write("<h1>hello response</h1>");
}
@RequestMapping("/response2")
public ResponseEntity<String> response2(HttpServletResponse response) throws IOException {
return ResponseEntity
.status(401)
.header("name","itcast")
.body("<h1>hello response</h1>");
}
}