HTTP报文详解

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


image-20220903153925990

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报文总结

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

image-20220903153925990

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请求,发送其他请求需要程序员手动指定。

对数据长度的限制

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

POST 方法比 GET 方法安全?

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

5. 状态码

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

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

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

Http状态码Http Status CodeHttp状态码含义中文说明
200200 OK请求成功
201 201 Created请求已被接受,等待资源响应
202202 Accepted请求已被接受,但尚未处理
203203 Non-Authoritative Information请求已成功处理,结果来自第三方拷贝
204204 No Content请求已成功处理,但无返回内容
205205 Reset Content请求已成功处理,但需重置内容
206206 Partial Content请求已成功处理,但仅返回了部分内容
207207 Multi-Status请求已成功处理,返回了多个状态的XML消息
208208 Already Reported响应已发送
226226 IM Used已完成响应

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

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

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

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

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

Http状态码Http Status CodeHttp状态码含义中文说明
500500 Internal Server Error服务器端程序错误
501501 Not Implemented服务器不支持的请求方法
502502 Bad Gateway网关无响应
503503 Service Unavailable服务器端临时错误
504504 Gateway Timeout网关超时
505505 HTTP Version Not Supported服务器不支持的HTTP版本
506506 Variant Also Negotiates服务器内部配置错误
507507 Insufficient Storage服务器无法存储请求
508508 Loop Detected服务器因死循环而终止操作
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值