HTTP基础知识
关键字:
一问一答
用于和服务器交互
什么是HTTP
HTTP是个应用层协议,是HTTP客户端和HTTP服务器之间的交互数据格式。所以这里有个实例:在浏览网页的时候,浏览器会向服务器发送一个HTTP请求,告诉服务器我想访问什么..然后服务器会根据请求计算出HTTP响应(一般不止一个)让浏览器接收,里面包括了CSS、JS、HTML等信息。
通过浏览器的开发者工具Network栏可以监视到相关的http信息。

HTTP协议格式

通过抓包工具获取一个http数据包可以看到HTTP请求为:
POST https://weibo.com/ajax/feed/reportTipsAd HTTP/1.1 Host: weibo.com Connection: keep-alive Content-Length: 75 server-version: v2023.01.13.2 sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="108", "Microsoft Edge";v="108" DNT: 1 X-XSRF-TOKEN: ke6hGT9aa3M23Vs_oSOJtuhC traceparent: 00-d4b51744c9ffb7f50fc79b3483b66bd6-2f7c1a70cebae691-00 sec-ch-ua-mobile: ?0 client-version: v2.37.31 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76 Content-Type: application/json;charset=UTF-8 Accept: application/json, text/plain, */* X-Requested-With: XMLHttpRequest sec-ch-ua-platform: "Windows" Origin: https://weibo.com Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://weibo.com/u/3235322060/home?topnav=1&wvr=6 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5w1ynisFsDgViNmPqUd4E55JpX5KMhUgL.FoeEe0-0eoz7So52dJLoI7ySqPxXwgp4I5tt; SINAGLOBAL=786663887818.4773.1668729189177; SSOLoginState=1673408840; XSRF-TOKEN=ke6hGT9aa3M23Vs_oSOJtuhC; _s_tentry=weibo.com; Apache=2034831546041.4402.1673442465212; ULV=1673442465311:6:3:1:2034831546041.4402.1673442465212:1672998500749; ALF=1676380519; SCF=Aj2UkZGnUix87JONpJqrZn0Toq8qM6i-dM6IiBr3QcprB49616dFYaZWx80jufhYLiYYqPv7Dnup3VUhqzu61lI.; SUB=_2A25Ox4w6DeRhGeVM6FcS8izMzTyIHXVttPryrDV8PUNbmtANLVbakW9NTKbpK3VFtYovwqJ53RHKTm_SN9PuqC2p; WBPSESS=j5bVwsPyplgKhEqeOaEJABifqr1gMuMEvdcTvKzYEYF9Crylrt-5KEjYodjmTRGFlaHxj5VvZYmvuO4s6glrEgwpYR-DwzSLTLDMoJbJppv65uZ2vwW3BFOVGvOJhVKLt2iYbrQNfhFGyLcOY2ZAig==
{"posid":"pos60e2a7e96ddb1","adid":"ad_63c28d711f227","page":"home","pv":1} |
包含:
首行: [方法] + [url] + [版本]
Header: 请求的属性(每组属性之间使用\n分隔) / 冒号分割的键值对(遇到空行表示Header部分结束)
Body: 空行部分内容都是Body, Body允许使用空字符串. 假如Body存在则Header中会有一个Content-Length属性来标识Body的长度
HTTP响应为:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 33 Connection: keep-alive Server: Weibo API Gateway Date: Sun, 15 Jan 2023 13:15:23 GMT Vary: Origin Access-Control-Allow-Origin: https://s.weibo.com Access-Control-Allow-Credentials: true X-Log-Uid: 3235322060 x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block x-content-type-options: nosniff x-download-options: noopen x-readtime: 18 PROC_NODE: mapi-weibopro-node-bypass-698985b8f6-tg2ll SSL_NODE: mweibo-sslv6-003.dbl.intra.weibo.cn LB: 111.13.225.93 X-Wag-Info: bWFwaV9m
{"code":100000,"msg":"ok","ok":1} |
包含:
首行: [版本号] + [状态码] + [状态码解释]
Header: 和请求的规则一样
Body: 和请求的规则一样, 但是通常而言请求的Body不会很长的, 而假如服务器返回了一个htnl页面, 那么html的内容就是在body中.
空行的作用
HTTP协议没有规定有多少个键值对, 所以空行就自然作为一个"报头结束标记"了
HTTP(3.0版本之前)都是依赖TCP的, 没有空行就会发生粘包问题(TCP字节流嘛, 没有长度限制, 所以需要一定的标识符来声明什么时候才读取完一段数据).
HTTP中的内容
URL
Uniform Resource Locator, 唯一资源定位符, 用于找到网络上的资源, 还有一个概念叫URI, 叫唯一资源标识符, 用于区分网络上的资源, 这两者很相似, 平时不会做显示区分.
URL的格式通常为: [协议方案名] + [认证信息] + [服务器地址] + [服务器端口号] + [带层次的文件路径] + [查询字符串] + [片段标识符]
如:
https://www.bilibili.com/?spm_id_from=333.999.b_696e7465726e6174696f6e616c486561646572.1 |
协议方案名: 如http \ https \ jdbc:mysql
可省略,省略后默认是http://
认证信息: 以前可能会有user:pass这样的账号密码信息在URL中明文传输, 现在好像基本已经没有了
可省略
服务器地址: 服务器地址的形式应该为IP地址, 例子中的www.bilibili.com是一个域名, 通过DNS系统解析后可以看到其具体的IP地址
可省略,假如是HTML页面的话,省略后表示服务器的ip/域名和当前html所属的相同
服务器端口号: 关联到服务器的进程端口.
可省略,http默认端口号是80, https默认是443
带层次的文件路径: 通过文件路径来查找信息
可省略,省略后相当于/.,有些服务器会在发现路径的时候自动访问/index.html(主目录,默认打开的画面)
查询字符串: 就是一个键值对结构, 键值之间通过=连接, 键值对之间通过&分隔2
可省略
通过程序员自约定的键值对形式来告诉服务器我们需要什么样的信息
片段标识符: 通常用来标记浏览到网页的哪个片段, 下次访问的时候可以直接定位

通过cmd的ping命令可以查看域名的IP地址
p.s. 因为/?:这样的字符在HTTP的格式中已经被占用,假如报文中还有这样的字符出现就需要通过URL encode转译成 [%] + [两位16进制] 的形式(中文等同理)。如“我”就是%E6%88%91
方法Method

方法如上图
HTTP中的方法和Java中的方法概念不同,这里的方法更像是一个标识符,用的最多的就是GET和POST。
GET
GET是表示请求,用于获取服务器中的资源。如在浏览器中输入一个URL时,浏览器就会发送一个方法为GET的HTTP请求到服务器中;HTML中的link、href、img、script都会触发GET(点击后触发,然后从服务器中获取相关资源)
POST
POST和GET貌似没有本质的区别,区别可能是在应用场景上吧,在用户提交输入的数据给服务器(如登录页面)时候多有POST。通过HTML中的form标签、JS的ajax也可以构造POST请求。
GET和POST的区别
应用场景区别:GET多用于获取数据,POST多用于提交数据(不绝对)
内容区别:GET的Body通常为空,数据信息通过query string查询字符串传递;POST的Body通常不为空,数据信息通过Body传送,而query string为空。(POST的Body中可以直接传输二进制数据,query string虽然无法直接传输二进制数据,但是可以针对二进制数进行url encode)
特性区别:GET通常是幂等的(标准建议实现成幂等的),POST反之。这个特性也宣告GET可以被缓存,而POST不行。(幂等即多次请求会得到相同的结果)
报头Header
HTTP中首行后的都是键值对,所以Header其实是很多对键值对的集合。常见键值对如:
Host: 表示服务器主机的地址和端口
Content-Length: 表示body中数据的长度(应该是字节为单位?)
Content-Type: 表示body中数据的格式, 如:
application/x-www-form-urlencoded: form表单提交的数据格式
multipart/form-data: form表单提交的数据格式(通常用于提交图片/文件)
application/body数据格式: 如application/json \ application/pdf 分别表示body的数据格式为json和pdf
text/body的数据格式: 如text/html \ text/css 分别表示body数据格式是HTML和CSS
User-Agent: 表示浏览器 / 操作系统的属性
Referer: 表示这个页面从那个页面跳转过来(关联广告计费)
Cookie: 存储字符串用于实现"身份标识"功能, 可能来自于网页自行通过JS写入, 也可能又服务器发来的HTTP响应中的Set-Cookie返回给浏览器进行设置的(Cookie一个应用场景是保持登录状态)
Content-Type
用于定义网页编码类型和网络文件类型,决定了浏览器以何种方式解析文件。编码就通常为UTF-8字符集,文件类型主要掌握一下三类:
常见的媒体格式类型:[text/] + [文件类型],如text/plain、text/html;[image/] + [图像类型],如image/gif、image/png、image/jpeg等
application开头的媒体格式类型:[application/] + [文件类型],如application/pdf、application/json、application/msword等
上传文件时使用的类型:multipart/form-data
更多的话其实有个对照表,需要的话就上网查吧

d
正文Body
Body的内容与Header的Content-Type密切相关
如当Content-Type为application/x-www-form-urlencoded时,内容就是query-string般的键值对:

当Content-Type为application/json时,内容就是json格式

HTTP请求
form构造
form是HTML中一个常用的标签, 可用来向服务器发送GET或者POST请求.

其中action对应context path/后的url内容
ajax构造
HTTP响应
状态码Status Code
2系 (成功状态码)
200 OK: 表示访问成功
3系 (重定向状态码)
301 Moved Permanently: 永久重定向. 当服务器收到这种响应后, 后续的请求都会被自动改成新的地址.(通过Location字段重定向)
302 Move Temporarily: 要求客户端临时重定向. 比如登录页面中登录成功后, 自动跳转页面就是一次临时重定向.
4系 (客户端错误状态码)
403 Forbidden: 表示访问被拒绝. 在没有访问权限的时候就会出现403, 比如没有登录直接尝试访问.
404 Not Found: 表示没有找到资源. 在浏览器输入URL就是为了访问服务器的某个资源, 当这个资源不存在时候就会出现404.
405 Method Not Allowed: 表示方法不支持. 服务器不一定支持所有的方法, 或者不允许用户使用某些方法.
5系 (服务器错误状态码)
500 Internal Server Error: 服务器出现内部错误. 通常在服务器崩溃时候才会出现.
504 Gateway Timeout: 服务器响应超时. 服务器负载过大导致计算响应耗时过长会出现.
注意!HTTP虽然有状态码,但这不是说HTTP是有状态的。HTTP是无状态的。
HTTP
相关文章:

HTTP基础知识
关键字:一问一答用于和服务器交互什么是HTTPHTTP是个应用层协议,是HTTP客户端和HTTP服务器之间的交互数据格式。所以这里有个实例:在浏览网页的时候,浏览器会向服务器发送一个HTTP请求,告诉服务器我想访问什么..然后服…...

Delphi 10.4.2使用传统代码提示方案(auto complete)(转)
Delphi 10.4重点是实现了LSP,但现在最新的10.4.2还是不成熟,无法满足日常需要,不过没关系,可以设置为原有的方案,如下图:具体操作:Tools->Options->Editor->language->Code Insight…...
存储类别、链接与内存管理(三)
1、malloc函数详解 (1)函数声明 #include <stdlib.h> void* malloc(size_t size);malloc可以申请一定数量的空闲内存,这样的内存是匿名的,也就是malloc不会为其赋名,但是确实返回动态分配内存块的首元素地址&a…...

Java:Linux(CentOS)安装、配置及相关命令
目录一、VMware安装二、CentOS安装1、安装过程2、加载ISO2.1 桌面的设置三、VI/VIM编辑器1、一般模式2、编辑模式3、命令模式4、模式间转换四、网络配置和系统管理操作1、配置子网IP和网关2、配置虚拟机ip地址2.1 ifconfig 查询ip地址2.2 修改IP地址3、配置主机名3.1 hostname …...
Linux 操作系统原理 — 多任务优先级调度策略
目录 文章目录 目录多任务优先级调度策略User Process 调度策略配置调整 User Process 的优先级调整非实时进程的优先级调整实时进程优先级调整 User Process 的调度算法多任务优先级调度策略 在 Linux Kernel 中,Kernel Thread 作为唯一的调度实体,Kernel Scheduler(调度程…...
链表学习之找到两个链表相交的第一个节点
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 找到两个链表相交的第一个节点 给定两个链表,这两个链表可能有环,可能无环。判断这两个链表是否相交,相交则返回第一…...

【Kubernetes】【十一】Pod详解 Pod的生命周期
Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main container) 容器启动后钩子&#…...
Connext DDS录制服务 Recording Service(1)
1 序言 1.1 简介 RTI记录服务包括以下工具: •记录服务,一种RTI Connext DDS应用程序,用于记录主题和发现数据。记录服务记录数据更新以及时间戳,因此您可以查看或回放系统中随时间发生的数据更新。默认情况下,记录的数据存储在SQLite文件中。录制服务还具有一个API,用于…...

vTESTstudio - VT System CAPL Functions - VT2004(续2)
不要沮丧,不必惊慌,做努力爬的蜗牛或坚持飞的笨鸟,我们试着长大,一路跌跌撞撞,哪怕遍体鳞伤。vtsSetPWMVoltageLow - 设置PWM输出上的低电压功能:指定数字输出信号(尤其是PWM信号)输…...

每天一个linux命令---awk
awk命令 1. 简介 awk是一种处理文本文件的语言,是一个强大的文本分析工具,grep、sed、awk并称为shell中文本处理的三剑客。 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&am…...
Open3D 点云旋转之轴角式(Python版本)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 三维空间中表示旋转的方法有很多种,轴角式是其中非常经典的一种表示方式。虽然欧拉角表示旋转的方法很是常用,但欧拉角存在着万向锁这个问题,因此轴角式旋转在旋转使用中更为合适。其原理也很是明了,如下所述:…...

Error: Timeout trying to fetch resolutions from npm
文章目录问题描述【最终解决】我搜索到的解决方案npmjs 该依赖各版本列表及对应的被下载次数github issue 说降级到0.0.3就可以正常运行了SOF 也说降级别到0.0.3问题描述 在项目里用到了 "preinstall": "npx npm-force-resolutions"配置,在一台…...

Python基础3
目录 1. 函数多返回值 2. 函数多种传参方式 3. 匿名函数 3.1 函数作为参数传递 3.2 lambda匿名函数 4. 文件的读取操作 4.1 open()打开函数 4.2 读操作方法 4.3 文件的写入 4.4 文件的追加 5. 异常的捕获方法 5.1 捕获常规异常 5.2 捕获指定…...
高可用集群(HAC)
1、高可用集群keepalive说明 高可用定义: 目的:尽可能的提高服务的可用性 99%、99.9%、99.99%、99.999% 实现原理:心跳检测服务: 有状态: MySQL 无状态: apacheLVS Keepalive原理 案例环境专为 LVS和…...

python基于django微信小程序的适老化老人健康预警小程序
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…...

基于微信小程序图书馆管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis-plus本系统分微信小程序和管理后台两部分,项…...

将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码
之前遇到过“镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for field “intensity“ 问题”, 当时确定了是镭神C32雷达缺少相应字段,并记录博客【学习记录】镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for fi…...

高级前端一面面试题集锦
详细说明 Event loop 众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点&#…...

Java基础 -- List集合
Java基础 -- List集合1. Introduction1.1 好处1.2 常用泛型2. 交集,差集等2.1 自身的方法2.2 1.8jdk stream 新特性2.3 Apache的CollectionUtils工具类(推荐)3. 限定泛型范围4. Awakening1. Introduction 1.1 好处 代码复用,多种…...

【Linux】网络编程 - Socket套接字/基于UDP的网络通信
目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...