HTTP报文详解

news2025/2/3 0:52:39

个人博客地址:
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. 状态码

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服务器因死循环而终止操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针进阶1 2

字符指针 int main() {char ch q;char* pa &ch;return 0; }不仅可以这样写还可以指向一个字符串 int main() {/*char ch q;char* pa &ch;*/char* ph "hello world";printf("%c\n", *ph);//打印遇到\0才会结束,没数据会打印随机值…

pybind11学习 | VS2022下安装配置

pybind11是一个只有头文件(header-only)的轻量级库,其主要目的是建立C的Python代码绑定,实现C和Python无缝连接。我学习这个工具的目的,是为了能够在Python中调用C代码实现一些计算密集型任务,同时培养自己…

Java后端核心技能知识点

今天带来的是2022全新升级的《Java岗面试核心版》,这个版本里面不仅仅包含了面试题,还有更多的技术难点、大厂算法、实战项目、简历模板等等,全册接近1700页!相比上一个版本的287页,升级了多少内容你懂的 大概内容&am…

南京邮电大学编译原理实验二(语法分析程序)

文章目录一、文法二、源代码模块(一)消除文法的左递归(二)求First集(三)求Follow集(四)构建LL(1)分析表(五)符号串分析(六)主函数三、…

破解色带现象(下)

编者按:本文是“破解色带现象”文章的第二部分,Fabio Sonnati进一步 分析了色带现象产生的原因,并提供了新的检测办法。本文已获得作者授权转载。翻译:Argus原文链接:https://sonnati.wordpress.com/2022/09/16/defea…

Flink实战案例四部曲

Flink实战案例四部曲 第一部曲:统计5分钟内用户修改创建删除文件的操作日志数量 输入 1001,delete 1002,update 1001,create 1002,delte 输出 1001,2 1002,2代码如下。 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironmen…

Anlios装grouplist 组件之后报错,安装tiger-vncserver

因为之前升级了一个epel-release源,然后containerd也装进去了,但是版本太低 然后以为是runc挡住了,发现没有runc 删完了containerd就可以装了 rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm dnf install wntp…

【性能篇】30 # 怎么给WebGL绘制加速?

说明 【跟月影学可视化】学习笔记。 常规绘图方式的性能瓶颈 例子&#xff1a;在一个画布上渲染 3000 个不同颜色的、位置随机的三角形&#xff0c;并且让每个三角形的旋转角度也随机。 <!DOCTYPE html> <html lang"en"><head><meta charse…

SpringBoot+Vue实现前后端分离的高校思政课实践教学管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

基于SSM的大学生心理健康系统设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系信息、文章信息、咨询师信息、服务信息、测试信喜 管理员功能&#xff1a; 1、管理…

继续谈谈从Rxjava迁移到Flow的背压策略

前言 对于背压问题不久前就讨论过了&#xff0c;这里就不过多介绍了&#xff0c;总之它是一个非常复杂的话题&#xff0c;本文的主要目的是分析我们如何从Rxjava迁移到Flow并且使用其背压方案&#xff0c;由于本身技术的限制以及协程内部的复杂性&#xff0c;不会做过多的深入…

下载安装PyTorch

1、下载并安装Visual Studio Code选择合适版本安装 2、下载安装conda并配置环境 下载方式一&#xff1a;官网下载 下载方式二&#xff1a;清华镜像安装 3、conda配置环境 打开电脑高级系统配置点开系统环境变量&#xff1a; 找到path然后点击Edit或者直接双击&#xff1a; 之后…

利用LSTM识别篇章关系实战代码+数据

1.显式篇章关系分类概述 案例知识点: 任务描述:篇章关系分析是自然语言中处理篇章级基础语言分析任务,其目的是利用规则或机器学习等计算机处理手段判别篇章各组成成分之间的修辞逻辑关系,从而从整体上理解篇章。其中论元之间有连接词连接的此类关系称为显式篇章关系。本教…

实验七、MOS管分压式偏置共源放大电路的静态和动态参数

一、题目 搭建MOS管分压式偏置共源放大电路。利用Multisim研究下列问题&#xff1a; &#xff08;1&#xff09;确定一组电路参数&#xff0c;使电路的 QQQ 点合适。 &#xff08;2&#xff09;若输出电压波形底部失真&#xff0c;则可采取哪些措施&#xff1f;若输出电压波形…

Mysql概念知识

Mysql数据库基础知识为什么要使用数据库数据保存在内存数据保存在文件数据保存在数据库什么是SQL&#xff1f;什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有几种录入格式&#xff1f;分别有什么区别&#xff1f;数据类型mysql有哪些数据类型引…

计算机毕设Python+Vue学生资源管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

websocket使用方法

前言 最近项目用到了websocket接口&#xff0c;用来做长连接&#xff0c;监听服务器数据变化&#xff0c;保持各终端数据同步。 用下来发现确实很好用&#xff0c;避免了轮询&#xff0c;开销小&#xff0c;而且最重要的是没有同源策略限制。 websocket WebSocket 是一种在…

Nginx-安装和部署全过程

前言 OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。openresty官网&#xff1a;OpenResty - 中文官方站 …

软件著作权到底享有哪些权利?

根据《计算机软件保护条例》相关规定 软件著作权人享有下列各项权利: &#xff08;一&#xff09;发表权&#xff0c;即决定软件是否公之于众的权利&#xff1b; &#xff08;二&#xff09;署名权&#xff0c;即表明开发者身份&#xff0c;在软件上署名的权利&#xff1b; &a…

iOS的启动优化

应用的启动优化 当我们参与到大型应用的时候 会遇到一些启动时间过长的情况 这时候就需要使用到相关的操作。 总结来说&#xff0c;main()方法调用前&#xff0c;启动过程大体分为如下步骤&#xff1a; 先是LLVM把项目翻译成IR文件然后到backend&#xff0c;PRE_MAIN,main。 …