当前位置: 首页 > news >正文

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环境下&#xff1a; 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开发

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

电机控制的空间矢量调制 (SVPWM)

目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM)&#xff0c;空间矢量调制 (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时&#xff0c;循环自动终止cout << a b << endl;}return 0; }getline #include <iostrea…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...