HTTP-
一.HTTP
1.什么是HTTP
HTTP(超文本传输协议)是一种工作在应用层的协议.主要用于网站,就是浏览器和服务器之间的数据传输.
小知识:什么是超文本传输协议
文本:是字符串.(能在utf8/gbk码表上找到合法字符)
超文本:不仅可以传输字符串,也可以传输图片,html等
富文本:word文档
2.HTTP的发展
HTTP在3.0版本之前,都是基于TCP实现的,而在3.0版本之后是基于UDP实现的.提升了传输效率,安全性也提到了明显的改善.而我们当前使用的是HTTP1.1版本.是基于TCP实现的,也是当前使用较多的.
3.HTTP的交互
HTTP的交互是一问一答的形式
而有些场景下,HTTP也是很难胜任的
比如我们用脑袋疼举例,此时就会弹出广告,我们点进去会主动先给你发一条消息
像把QQ这样的聊天窗口搬到网页上来,对方发来消息我们这边还有提示,这种情况HTTP的不能胜任了
上述场景是服务器主动给浏览器发消息,就称为消息推送.
上述是怎么实现的呢?
应用层这里还补充了一个websoket协议,用来给HTTP做补充
4.HTTP的报文格式
首先介绍HTTP的报文格式之前我们要先介绍一下专门用来抓HTTP的数据包的软件--fidder
下载完成之后我们还要对软件进行一些设置
我们需要获取证书,所谓的获取证书就是将fideer的公钥放置在系统内部,这个我们后边再解释.
这里的抓包工具其实就是一种"代理"程序.能够获取网络上的数据并显示出来给我们一些参考
代理分成两种
1.正向代理(客户端的代言人):比如我会求室友帮我带一份饭,此时室友就是我的代理
2.反向代理(服务器的代言人):比如食堂大妈今天也不想动弹,此时会让他的儿子来卖饭,此时他的儿子就是反向代理
而我们所谓的翻墙效果也是这样:有的境外的服务器我们不能直接访问.但是也有一些可以访问的,此时我们就会通过可以访问的服务器来访问不能访问的服务器,达到所谓的翻墙效果
此时按照上述的配置完成操作后,我们就可以进行抓包操作了.
上面蓝色的表示的是返回一个html,表示一个网站的入口请求.
我们可以双击查看明细
我们先看请求:
此时我们需要点击Raw,就可以查看请求的原始数据
接下来看响应:
我们可以发现红框中出现了乱码,这是因为为了减少网络带宽的消耗,对数据进行了压缩,要是想看到响应的正文,我们需要点击
此时我们就可以看到响应的原始数据
通过抓包我们来分析下HTTP请求的报文格式
HTTP请求的报文格式分为4个部分
1.首行
GET https://www.sogou.com/ HTTP/1.1
首行又包括三个部分:
GET:表示方法
https://www.sogou.com/:表示URL
HTTP/1.1:表示的是HTTP的版本号
2.请求头(采用键值对的方式)
此处的请求头的键值对内容都是HTTP协议规定的,具体我们后续介绍
3.空行
请求头结束会有一个空行,就是用来表示请求头结束
4.正文:body(也就是载荷)
有的请求有载荷
有的则没有
HTTP的响应报文格式也分为4个部分
1.首行
HTTP/1.1 200 OK
HTTP/1.1:表示的是HTTP的版本号
200:状态码,后续也会介绍
OK:状态码描述
2.响应头(同样也是键值对)
关于响应头的内容我们后面也会介绍
3.空行(标志着响应头结束)
4.正文body(载荷部分)
这里我们是第一次访问,所以服务器返回了页面的HTML代码.
5.认识URL
URL就是用来描述一个网络资源的位置.
URL的组成:
协议:就是当前使用的是什么协议(HTTP/HTTPS...)
登录信息:现在不常用,因为不安全
IP地址:用域名访问,更方便.通过地址知道服务器是哪个
端口:通过端口知道具体访问服务器的哪个程序
路径:通过路径知道访问的是哪个资源(此处可以是一个文件,也可以是一个虚拟文件)
查找字符串(quary string):针对请求做出的补充
片段标识符:标识当前页面的某个部分,通过不同的标识可以完成页面的跳转
URL就类似上面
6.关于URL encode
在quary string(查找字符串)中有很多程序员自定义的键值对
在URL中很多字符都有特殊的含义:/ : @等,如果quary string中也有相同的符号怎么办
此时我们就需要转义,当然对于汉字我们也需要转义.
7.请求头中的方法
GET:从服务器获取一个资源(读操作)
POST:往服务器放一个东西(写操作)
上述标准文档只是作者一厢情愿,我们也可以不用遵守
GET的使用场景:GET https://www.sogou.com/ HTTP/1.1
从服务器获取一个数据
POST的使用场景:
常见用于上传,登录
登录:
我们可以看到登录操作使用的是POST方法,登录的用户名使用的是json数据格式组织登录的,密码并不是我们自己设置的密码,而是进行了base64编码,将编码传输到服务器
小知识:
密码后面有 == 就是base64编码,Base64 是一种将二进制数据编码为 ASCII 字符串的编码方式,常用于在文本协议(如 HTTP、电子邮件)中安全传输二进制内容。
上传:
8.GET和POST的区别(经典面试题)
本质上GET和POST没有区别,使用GET的场景也能用POST,使用POST的场景也能使用GET.
但是在使用习惯上二者还是有区别的:
1.GET习惯把数据放到URL中,POST习惯把数据放到body(载荷)中
同样GET也可以把数据放到body中,但是有的浏览器会有限制
POST也可以放到URL中,大多数是没有限制
2.语义上的区别
标准文档中GET适用于读取数据,POST用于传输数据
3.关于幂等性
标准文档中,建议GET是幂等的,POST无要求
小知识:
幂等性就是每次输入的结果一定,输出的结果也一定,就是幂等
每次输入的内容一定输出的结果不一定,就不是幂等
就像牛吃的是草,挤的是奶,而不是吃的是草挤的是bb.
4.GET可以被浏览器收藏夹收藏,POST不可以
网络上一些关于GET和POST的解释也不是很准确,大家理性看待
1.POST比GET更加安全
依据:GET传输的数据是放在URL中的,而POST存放的数据是放在body中的.
登录场景中,如果密码放到URL中可能会被看到,所以不安全,但是POST也是可以被心怀叵测的人抓包得到body.
辟谣:真正保证安全的,不是使用什么方法,而是对数据进行加密
2.GET传输的数据量很小,POST传输的数据量很大
以前确实是这样的,但是现在标准文档明确指出对GET的URL不做长度的限制
3.GET只能携带文本数据,POST只能携带二进制数据
这个说法不一定完全错,URL是通过quary string来保存数据,quary string是只能包含文本数据的,但是urlencode可以对二进制文件进行编码,自然也就成了文本了
POST请求中也不是经常携带二进制数据,而是对二进制文件进行base654/urlencode进行转码
9.认识"报头"
1.Host:表示服务器主机的IP地址和端口号
2.Content_Length:表示body(正文)的数据长度,因为HTTP1.1是基于TCP实现的,可能会出现粘包问题(具体粘包问题关注TCP章节),所以用规定数据长度来避免粘包问题
3.Content_Type:表示正文的类型
请求中会有的格式:
(a).application/json --body就是json的数据格式
(b)application/x-www-form-urlencode,通过form表单,特点就是把quary string放到body里了
(c)multipart/form-data;上传文件使用
不拘泥于上述三种格式,程序员自己也可以定义
响应中的格式
(a)text/plain:纯文本
(b)text/html:返回HTML
(c)text/css:返回css
(d)application/Javascript:返回js
(e)application/json:返回json
(f)image/png
(g)image/jpg:最后两个都是返回图片
4.User-Agent(UA):
描述了当前访问的操作系统的信息以及浏览器信息
UA在以前是非常常用的,由于用户的设备存在差异,就可以通过UA区别设备,从而正确返回用户想要的数据
5.Refer
表示当前的页面是由哪个页面跳转而来.
以前HTTPS的并没有得到普及的时候,运营商通过篡改Refer来获取不菲的收益,广告公司看到Refer都是运营商那边投来的流量,自然就把钱分走了.这就是运营商劫持.
6.Cookie:
最重要的属性,Cookie就是持久化的保存一些信息.
关于Cookie的几个结论:
1.Cookie是首次通信,服务器返回给客户端的
2.Cookie会存储到客户端的硬盘上,后续每次访问都会带上Cookie,存储到硬盘就达到了持久化存储.不同的客户端保存的Cookie保存的内容是不同的
3.Cookie中保存的是键值对,是程序员自己定义的,我们无从得知
4.Cookie在硬盘本地保存,是按照不同域名为维度分别存储
5.Cookie最主要的就是保存用户的身份标识,这样数据传输到服务器,服务器就可以区别出用户
10.状态码
在响应中上述的200就是一个状态码.HTTP中的状态码都是约定好的.
接下来我们认识几个常见的状态码:
1.200 OK 表示一切顺利
2.404 NOT FOUND 访问的资源没有找到
3.403 Forbidden 表示请求的资源没有权限访问
4.405 Method Not Allowed 你的服务器只支持GET,但是你发了个POST
5.500 Interal Server Error 服务器内部错误,可能是服务器挂了
6.504 Geteway Timeout 访问服务器超时
7.302 Move temporarily 临时重定向.如果一个网站更换了新的域名,但是老用户并不知道,此时访问原来的域名就可以跳转到新的域名.
8.301 永久重定向.浏览器会把重定向的结果记录下来.后续再访问就会直接访问重定向的目标地址即可,不用跳转
11.如何构造一个HTTP请求
两种方法:使用代码构造
public class HttpClient {private Socket socket;private String ip;private int port;public HttpClient(String ip, int port) throws IOException {this.ip = ip;this.port = port;socket = new Socket(ip, port);}public String get(String url) throws IOException {StringBuilder request = new StringBuilder();// 构造⾸⾏ request.append("GET " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");// 构造 空⾏request.append("\n");// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public String post(String url, String body) throws IOException {StringBuilder request = new StringBuilder();// 构造⾸⾏request.append("POST " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");request.append("Content-Length: " + body.getBytes().length + "\n");request.append("Content-Type: text/plain\n");// 构造 空⾏request.append("\n");// 构造 bodyrequest.append(body);// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public static void main(String[] args) throws IOException {HttpClient httpClient = new HttpClient("42.192.83.143", 8080);String getResp = httpClient.get("/AjaxMockServer/info");System.out.println(getResp);String postResp = httpClient.post("/AjaxMockServer/info", "this is body"System.out.println(postResp);} }
2.使用第三方工具(postman)
关于HTTP我们就介绍这里
相关文章:

HTTP-
一.HTTP 1.什么是HTTP HTTP(超文本传输协议)是一种工作在应用层的协议.主要用于网站,就是浏览器和服务器之间的数据传输. 小知识:什么是超文本传输协议 文本:是字符串.(能在utf8/gbk码表上找到合法字符) 超文本:不仅可以传输字符串,也可以传输图片,html等 富文本:word文档 2.HT…...
创建型模式 - 原型模式 (Prototype Pattern)
创建型模式 -原型模式 (Prototype Pattern) 它允许通过复制现有对象来创建新对象,而无需知道对象的具体创建细节。在 Java 中,可以通过实现 Cloneable 接口和重写 clone() 方法来实现原型模式。 有深、浅两种克隆 类实现 Cloneable 接口就可以深克隆如果…...
Android 8.0 (API 26) 对广播机制做了哪些变化
大部分隐式广播无法通过静态注册接收,除了以下白名单广播: ACTION_BOOT_COMPLETED ACTION_TIMEZONE_CHANGED ACTION_LOCALE_CHANGED ACTION_MY_PACKAGE_REPLACED ACTION_PACKAGE_ADDED ACTION_PACKAGE_REMOVED 需要以动态注册方案替换: cl…...

Unity汽车笔记
汽车的移动和转向 我们知道,汽车的前进后退是变速运动。按w,汽车开始加速,到最大速度后保持匀速,松开w,汽车受到阻力加速。如果按s减速,则以更大的加速度减速。后退反之。 按A/D时前轮偏转。只有前进后退…...
html中rel、href、src、url的区别
1.url url(统一资源定位符):是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 2.href href:Hypertext Reference的缩写。 意思是超文本引用。 3.rel rel:relatio…...
【idea问题排查技巧】
以下是针对 IDEA 中 日志打标(动态标记) 和 全链路追踪 功能的分步详解,结合具体场景和操作截图说明,帮助快速掌握实战技巧。 一、动态日志打标:不修改代码输出关键信息 1. 断点日志打印(非侵入式打标) 场景:在调试时,需要临时查看某个变量的值,但不想修改代码添加…...

SQL: DDL,DML,DCL,DTL,TCL,
Structured Query Language,结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL(Data Query Language):数据查询语言 DDL(Data Definition Language):数据定义语…...
WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
DeepSeek基础之机器学习
文章目录 一、核心概念总结(一)机器学习基本定义(二)基本术语(三)假设空间(四)归纳偏好(五)“没有免费的午餐”定理(NFL 定理) 二、重…...

QSplashScreen --软件启动前的交互
目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…...
Python 循环嵌套
Python 循环嵌套 引言 在编程语言中,循环嵌套是一种常见且强大的编程技术。它允许开发者重复执行一段代码块,并在每个循环迭代中执行另一个循环。在Python中,循环嵌套广泛应用于数据分析和算法实现等领域。本文将详细介绍Python循环嵌套的概念、语法以及应用场景。 循环嵌…...

性能测试项目实战
项目介绍和部署 项目背景 轻商城项目是一个现在流行的电商项目。我们需要综合评估该项目中各个关键接口的性能,并给出优化建议,以满足项目上线后的性能需要。 项目功能架构 前台商城:购物车、订单、支付、优惠券等 后台管理系统:商…...

Web自动化之Selenium实战案例2:东方财富网股吧评论爬取
上一篇文章,我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构,我们可以确定需要抓取的数据位置以及操作元素的方式。…...

【Java八股文】09-计算机操作系统面试篇
文章目录 计算机操作系统面试篇用户态和内核态的区别?用户态和内核态的区别? 进程管理线程和进程的区别是什么?进程,线程,协程的区别是什么?创建一个协程的过程线程运行过程中申请到的东西在切换时是否全部…...

【Redis】在Java中以及Spring环境下操作Redis
Java环境下: 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…...

MFC—加法器
1.需要为编辑框添加变量 2.在cpp文件中的按钮中添加代码 void CMFCAddtionDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码UpdateData(true);//把控件里的值更新给变量m_add m_add1 m_add2;//加法UpdateData(false);//把控件相加的值赋值给控件 }...

SpringBoot五:Web开发
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 要解决的问题 导入静态资源首页jsp,模板引擎Thymeleaf装配扩展SpringMVC增删改查拦截器国际化(非重点) 可以使用以下方式处理静态…...

电机控制的空间矢量调制 (SVPWM)
目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM),空间矢量调制 (SVPWM) 是感应电机和永磁…...
jupyterhub on k8s 配置用户名密码 简单版
如果只是小组内使用 不想共用密码 也不想搞复杂认证方案 那么就直接通过map(用户名,密码md5值)来制定密码 config.yaml部分内容 hub:config:JupyterHub:shutdown_on_logout: true # 用户logout 自动stop jupyter pod,家目录下所有文件会被保存到pvc 即启动后之前家目录下…...
c++笔试准备
一、 输入输出 1.多组数据【while】 cin #include <iostream> using namespace std;int main() {int a, b;while (cin >> a >> b) { // 当读取到EOF时,循环自动终止cout << a b << endl;}return 0; }getline #include <iostrea…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...