HTTP报文详解

个人博客地址:
http://xiaohe-blog.top/

文章目录

  • 1. 请求
    • 1.1 请求行
    • 1.2 请求头
    • 1.3 空白行
    • 1.4 请求体
  • 2. 响应
    • 2.1 状态行
    • 2.2 响应头
    • 2.3 空白行
    • 2.4 响应体
    • 2.5 HTTP报文总结
  • 3. HTTP方法
  • 4. GET与POST的区别
  • 5. 状态码

HTTP报文详解_第1张图片

1. 请求

1.1 请求行

请求方式 请求地址 请求协议版本号

PUT /employee/addEmployee HTTP/1.1

GET /user/query/id=2 HTTP/1.1

POST /user/login HTTP/1.1

1.2 请求头

包含此次请求的信息 ,例如此次请求的健康状态、cookie、发送数据的格式、发送数据的编码…

可以自己添加字段,使得请求有自己的特点,便于后端分辨。

请求头字段很多,不必背,content-type、cookie对编程有用,其他了解一下就可以。

Host 服务器主机地址和端口
content-type 请求体中的数据的数据格式
content-length 请求体中的数据的数据长度
Cookie 浏览器在本地存储数据的机制
User-Agent 简称UA,用户的操作系统和浏览器版本信息
Referer 上级跳转目录
  • **content-length **:请求体中的数据长度,GET没有请求体也就没有这个字段。

    HTTP 协议是基于TCP/IP协议的,TCP/IP传输的是字节流,有可能发生粘包问题(数据被错误拆分)。假如我想传输1、2、3,在TCP中传输时会被解析010203,万一这几个数字被解析为010或是0、10怎么办?

    所以此时要么约定结束符01&02&03。要么给数据一个具体的长度,content-length就是数据的长度,读取时按照length来读。

  • User-Agent :早些年通过UA来收集用户的操作系统/浏览器信息,不同的系统/浏览器渲染成不同的样子。现在很少用了。

  • Cookie :可以称为用户标识符,可以是前端自己写的,也可以是后端给的,大部分是登陆后给你一个字符串,你将它存入cookie,以后每一次请求你都要带着它,cookie错误或超时时请求会被拒绝。(这个要看业务实现方式)

1.3 空白行

换行,用于隔开请求头与请求体

1.4 请求体

存放此次请求的数据,可以是数字、json、图片…

此处的数据格式(例如是字符串还是图片)由请求头中的content-type决定。

如果content-type规定请求体的数据格式是图片,但是程序员输入的是json字符串,就会出bug。

如果是json格式的字符串:
{
	id: "1559479077667094530", 
    name: "小明",
    age: 19
}

GET请求没有请求体

2. 响应

2.1 状态行

响应协议/版本号 状态码

HTTP/1.1 200

状态码很重要,这能告诉我们bug在哪。

2.2 响应头

包含此次响应的信息。

如响应数据的格式、响应健康状态、响应时间…

响应头可以自己添加字段,这些都是按照需求来的。

因为可以自定义,所以不同的请求拥有的响应头不一样,此处举例为百度首页刷新之后的响应头(有些很繁琐的数据我删除了):

2.3 空白行

换行,隔开响应头与响应体

2.4 响应体

此次响应的数据,数据格式由响应头中的content-type决定

{
    "code":1,
    "msg":null,
    "data":"员工信息修改成功",
    "map":{}
}

2.5 HTTP报文总结

请求头、请求体、响应头、响应体都是可以自定义的,所以每个人抓包到的请求报文都可能是不一样的,需求不同报文就不同,但是格式相同。请求和响应都有四个部分:

HTTP报文详解_第2张图片

3. HTTP方法

HTTP请求提供了不同的方法,主要用于区分不同的请求目的是什么。

方法有很多,列举如下几个

方法 作用
GET 获取资源
POST 提交资源
PUT 新增资源
DELETE 删除资源
HEAD 获得报文头部
OPTIONS 询问支持方法

其中GET、POST是最常用的两个方法。

方法之间的区别很多吗?

其实没有本质区别。GET能做的事,POST几乎也能做,PUT能做的事,使用其他也大都能做,使用GET和POST可以解决90%的场景了,但是为什么要提供这么多方法呢?

这些方法的作用主要是语义化,你看到GET就知道前端想要获取资源,看到PUT就知道前端想要新增资源,看到DELETE就知道前端想要删除资源。

使用不同的方法使得编程更加规范。所以我更愿意称之为语义化方法

(这些方法在RESTFul风格的url使用最为广泛。如果只是使用servlet开发,大概率用不到语义化方法

4. GET与POST的区别

浏览器默认发的都是GET请求,发送其他请求需要程序员手动指定。

HTTP报文详解_第3张图片

对数据长度的限制

RFC标准原文中明确表示对URL长度不做限制,但是浏览器和HTTP服务器在实现的时候会有长度限制,这个取决于不同浏览器/HTTP服务器的实现。

POST 方法比 GET 方法安全?

按照网上大部分文章的解释,POST 比 GET 安全,因为POST数据在地址栏上不可见。
然而从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上抓包,就能完整地获取数据报文。所以他俩的安全性都不咋地。
要想安全传输,就只有加密,也就是 HTTPS。

5. 状态码

单独给状态码开一个目录,实在是因为它太重要。

HTTP状态码 信息
1xx 零食响应并需要请求者继续进行操作
2xx 操作成功接收并处理(正确不正确先不说,操作成功了)
3xx 表示要完成请求,需要进行进一步操作,通常这类状态码用来重定向
4xx 前端出错了
5xx 后端出错了

2xx :这一组状态码表明客户端的请求已经被服务器端成功接收并解析

Http状态码 Http Status Code Http状态码含义中文说明
200 200 OK 请求成功
201 201 Created 请求已被接受,等待资源响应
202 202 Accepted 请求已被接受,但尚未处理
203 203 Non-Authoritative Information 请求已成功处理,结果来自第三方拷贝
204 204 No Content 请求已成功处理,但无返回内容
205 205 Reset Content 请求已成功处理,但需重置内容
206 206 Partial Content 请求已成功处理,但仅返回了部分内容
207 207 Multi-Status 请求已成功处理,返回了多个状态的XML消息
208 208 Already Reported 响应已发送
226 226 IM Used 已完成响应

3xx : 这一组状态码表示客户端需要采取更进一步的行动来完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。

Http状态码 Http Status Code Http状态码含义中文说明
300 300 Multiple Choices 返回多条重定向供选择
301 301 Moved Permanently 永久重定向
302 302 Found 临时重定向
303 303 See Other 当前请求的资源在其它地址
304 304 Not Modified 请求资源与本地缓存相同,未修改
305 305 Use Proxy 必须通过代理访问
306 306 (已废弃)Switch Proxy (已废弃)请切换代理
307 307 Temporary Redirect 临时重定向,同302
308 308 Permanent Redirect 永久重定向,且禁止改变http方法

4xx :这一组状态码表示客户端的请求存在错误,导致服务器无法处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。

Http状态码 Http Status Code Http状态码含义中文说明
400 400 Bad Request 请求错误,通常是访问的域名未绑定引起
401 401 Unauthorized 需要身份认证验证
402 402 Payment Required
403 403 Forbidden 禁止访问
404 404 Not Found 请求的内容未找到或已删除
405 405 Method Not Allowed 不允许的请求方法

5xx :这一组状态码说明服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。

Http状态码 Http Status Code Http状态码含义中文说明
500 500 Internal Server Error 服务器端程序错误
501 501 Not Implemented 服务器不支持的请求方法
502 502 Bad Gateway 网关无响应
503 503 Service Unavailable 服务器端临时错误
504 504 Gateway Timeout 网关超时
505 505 HTTP Version Not Supported 服务器不支持的HTTP版本
506 506 Variant Also Negotiates 服务器内部配置错误
507 507 Insufficient Storage 服务器无法存储请求
508 508 Loop Detected 服务器因死循环而终止操作

你可能感兴趣的:(SpringBoot,后端,java,spring)