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

HTTP详解

一,什么是HTTP

HTTP(全称为“超文本传输协议”)',是一种应用非常广泛的应用层协议,之前在《初识网络原理》的博客(初识网络原理_徐憨憨!的博客-CSDN博客)中,有详细讲解过TCP/IP五层模型,其中应用层描述了数据的传输,负责应用程序间的沟通。

HTTP作为一个应用层协议,同样需要通过封装和分用来进行交互,HTTP往往是基于传输层的TCP协议实现的,实现了浏览器和服务器之间的交互;例如当我们在浏览器中输入一个百度的网址(URL)时,浏览器就会给百度服务器发送一个HTTP请求,百度的服务器就会给浏览器返回一个HTTP响应:

这个响应被浏览器解析之后,就展示成我们看到的页面内容,这个过程中,浏览器可能给服务器发送了多个请求,服务器对应的也会返回多个响应,这些响应里就包含了页面HTML,CSS,JavaScript,图片,文字等。

二,HTTP 的工作过程

1.工作过程

核心:浏览器给服务器发送请求,服务器响应浏览器的请求,HTTP就是浏览器和服务器之间交互的桥梁

2.抓包

现在我们大致知道了HTTP通过发送请求,然后服务器响应请求这样的过程来进行交互的,同时当我们访问一个网站时,可能涉及不止一次的请求/响应的过程,那如何知道http协议交互的详细过程呢?此时就需要借助第三方工具(称为“抓包”工具:fiddler)来看到。

1.fiddler的下载和使用

  1. 进入fiddler下载的官网进行下载安装(https://www.telerik.com/fiddler/

  1. 打开fiddler,安装https证书(因为大部分的hhtp协议都加密成了https)

3.选取一个抓取的包查看请求和响应

2.抓包工具的原理

Fidler相当于一个“代理”,当浏览器输入百度的网址进行访问时,就会先把请求发送给Fiddler,Fiddler再把请求转发给百度的服务器,当百度的服务器拿到数据返回时,Fiddler先拿到返回数据,再把数据交给浏览器,所以Fiddler可以清楚的知道浏览器和防服务器之间交互的数据细节。

三,HTTP协议格式

1.HTTP请求:

首行:【方法】+【URL】+【版本】;

Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束;

Body:空行后面的内容是Body,Body允许空字符串,如果Body存在,则在Header中会有一个Content-Length属性来表示Body的长度。

2.HTTP响应:

首行:【版本号】+【状态码】+【状态码解释】;

Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束;

Body:空行后面的内容是Body,Body允许空字符串,如果Body存在,则在Header中会有一个Content-Length属性来表示Body的长度,如果服务器返回了一个HTML页面,那么HTML页面内容就是在Body中。

3.格式图片总结

思考:为什么HTTP报文中要存在“空行”?

因为HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于是“报头的结束标记”,或者是“报头和正文之间的分隔符”,HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现“粘包问题”。

四,HTTP请求

1.URL基本格式

URL(统一资源定位符)就是平时俗称的“网址”,互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

假设一个网址如下:

https://v.bitedu.vip/personInf/student?userId=10000&classId=100

https:协议方案名;常见的有http和https,也有其他的类型(例如访问mysql时用的jdbc:mysql);

user:pass:登录信息;现在的网站进行身份认证一般不再通过URL进行了,一般都会省略;

v.bitedu.vip:服务器地址;此处是一个“域名”,域名会通过DNS系统解析成一个具体的IP地址;

端口号:上面的URL中端口号被省略了,当端口号省略的时候,浏览器会根据协议类型自动决定使用哪个端口;例如http协议默认使用80端口,https协议默认使用443端口;

/personInf/student:带层次的文件路径;

userId=10000&classId=100:查询字符串(query string);本质是一个键值对,键值对之间使用&分隔,键和值之间使用=分隔;

片段标识:此URL中省略了片段标识,片段标识主要用于页面跳转。

注意:

  1. query string中的内容是键值对结构,其中key和value的取值和个数,完全都是程序员自己约定的,可以通过这样的方式来自定制传输信息给服务器

  1. URL中可以省略的部分:

协议名:可以省略,省略后默认为http://

ip地址/域名:在HTML中可以省略(比如img,link,script等),省略后表示服务器的ip/域名与

当前HTML所属的ip/域名一致

端口号:可以省略;省略后如果是http协议默认使用80端口,https协议默认使用443端口;

带层次的路径:可以省略;省略后相当于/,有些服务器会在发现/路径的时候自动访问/index.html;

查询字符串:可以省略;

片段标识:可以省略。

2.方法

GET方法

get方法是最常用的http方法,常用于获取服务器上的某个资源

触发GET请求的方法:

  1. 在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求;

  1. HTML中的link,img,script等标签,也会触发GET请求;

  1. JavaScript中的ajax也能构造GET方法。

GET请求的特点:

  1. 首行的第一部分为GET;

  1. URL的query string可以为空,也可以不为空;

  1. hearder部分有若干个键值对结构;

  1. body部分为空。

POST方法

POST方法也是一种常见的方法,多用于用户提交用户数据给服务器(例如登录页面)

触发POST请求的方法:

  1. HTML的form标签可以构造POST请求;

  1. JavaScript中的ajax也可以构造POST请求。

POST请求的特点:

  1. 首行的第一部分为POST;

  1. URL的query string一般为空(也可以不为空);

  1. hearder部分有若干个键值对结构;

  1. body部分一般不为空,body内的数据格式通过header中的Content-type指定,body的长度由header中的Content-Length指定。

面试题:GET和POST的区别

核心:本质没有什么区别,只是使用习惯上的区别

  • 语义不同:GET一般用于获取数据,POST一般用于提交数据;

  • GET的body一般为空,需要传递的数据通过query string传递,POST的query string一般为空,需要传递的数据通过body传递;

  • GET请求一般是幂等的,POST请求一般是不幂等的(如果多次请求得到的结果一样,就视为幂等);

  • GET可以被缓存,POST不能被缓存。

3.请求报头(Header)

header的整体格式是键值对结构,每个键值对占一行,键和值之间使用分号分割

  • HOST:表示服务器主机的地址和端口

  • Content-Length:表示body中的数据长度

  • Content-type:表示请求中的数据格式

  • User-Agent(UA):表示浏览器/操作系统的属性

  • Referer:表示这个页面是从哪个页面跳转过来的

  • Cookie:Cookie 中存储了一个字符串,这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据);往往可以通过这个字段实现 "身份标识" 的功能;每个不同域名下都可以有不同的Cookie,不同网站之间的Cookie并不冲突

五,HTTP响应

1.状态码

状态码表示访问一个页面的结果(是访问成功,还是失败,还是一些其他的情况......)

常见状态码:

  • 200 OK:表示访问成功

  • 404 Not Found:表示没有找到资源

  • 403 Forbidden:表示访问被拒绝,有的页面通常需要用户具有一定 的权限才能访问

  • 500 Internal Server Error:表示服务器内部出现错误

  • 504 Gateway Timeout:表示当前服务器负载比较大,服务器处理单条请求的时候消耗的时间就会很长,就可能导致出现超时的情况

  • 302 Move temporarily:临时重定向

  • 301 Moved Peramnently:永久重定向

2.响应报头

响应报头的基本格式和请求报头的格式基本一致

六,构造HTTP请求

  1. 利用form表单构造请求

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!--  --><form action="http://www.sougou.com" method="get"><input type="text" name="studentName"><!-- input type=submit 构造了一个特殊的 提交 按钮 value属性描述了按钮中的文本 --><!-- 点击这个按钮就会触发该 form 表单的"提交操作" 也就是构造http请求发送给服务器 --><input type="submit" value="提交"></form>
</body>
</html>
  1. 利用ajax构造请求

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 引入 jquery --><script src="https://lib.baomitu.com/jquery/3.6.3/jquery.min.js"></script><script>$.ajax({type: 'get',url: 'https://www.sougou.com?studentName=zhangsan',//此处success就声明了一个回调函数,就会在服务器响应返回到浏览器的时候触发该回调//正是此处的回调体现了 "异步"success: function(data) {//data是响应的正文部分console.log("当服务器返回的响应到大浏览器之后,触发该回调");}});console.log("浏览器立即往下执行后续代码");</script>
</body>
</html>

相关文章:

HTTP详解

一&#xff0c;什么是HTTPHTTP(全称为“超文本传输协议”)&#xff0c;是一种应用非常广泛的应用层协议&#xff0c;之前在《初识网络原理》的博客(初识网络原理_徐憨憨&#xff01;的博客-CSDN博客)中&#xff0c;有详细讲解过TCP/IP五层模型&#xff0c;其中应用层描述了数据…...

cpufreq--处理器功耗控制

cpu 功耗控制 参考框架&#xff1a; cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口&#xff0c;以及功耗管理方案。 用户可以通过功耗管理接口&#xff08;以文件形式提供&#xff09;来选择管理方案&#xff0c;并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…...

Oracle 常见报错问题汇总

Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据

首先采用有人物联网的模块 &#xff0c;连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 &#xff1a;本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析

文章目录 前言一、Day3习题&#xff08;错题&#xff09;解析二、Day3习题&#xff08;原题&#xff09;练习总结前言 今天我们将进入到第三天的练习&#xff0c;希望能一直坚持下去&#xff0c;不断反思总结错误&#xff0c;得到进步&#xff1b; 一、Day3习题&#xff08;错…...

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?

简述 Android Jetpack的出现统一了Android开发生态&#xff0c;各种三方库逐渐被官方组件所取代。Room也同样如此&#xff0c;逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份&#xff0c;更是因为其良好的开发体验&#xff0c;大大降低了SQLite的使用门槛…...

推荐一款卸载软件的小工具-《UninstallToo》

目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代“添加/删除程序”的工具。它允许您显示隐藏的安装程序&#xff0c;按名称过滤已安装程序的列表&#xff0c;强行写在程序&#xff0c;浏览注册表项目&a…...

线程池——JUC随记8

线程池使用方式 1、一池N线程&#xff08;Executors.newFixedThreadPool(n)&#xff09; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ExecutorDemo {public static void main(String[] args) {ExecutorService execu…...

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址&#xff1a; 代码&#xff0c;笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1&#xff09;引入依赖2&#xff09;编写…...

高效学习方法论

2023.03.17 《程序员的三门课&#xff1a;技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1&#xff09;评估能力2&#xff09;制定目标3&#xff09;评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...

C语言结构体(一篇学会)

C语言结构体 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许用户将不同类型的数据组合在一起。结构体由多个变量组成&#xff0c;这些变量称为结构体的成员。结构体成员可以是不同的数据类型&#xff0c;如整数、浮点数、字符或其他结构体等。 结构体…...

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…...

普通Java工程师 VS 优秀架构师

1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够&#xff0c;懂技术/懂业务/懂管理的综合型人才&#xff0c;才是技术团队中的绝对核心。 不仅仅是架构师&#xff0c;所有的技术高端岗位&#xff0c;对人才的综合能力都有较高的标准。 架构路线的总设计师 规…...

Java:SpringBoot实现ApplicationEvent事件的监听和发布

通过发布订阅模式实现数据的异步处理&#xff0c;比如异步处理邮件发送 新建SpringBoot项目 项目结构 . ├── pom.xml └── src└── main├── java│ └── com│ └── example│ └── demo│ ├── Application.java│ …...

星戈瑞-Sulfo-Cyanine3 azide?磺酸基-Cy3-N3叠氮基水溶性染料

Sulfo-Cyanine3 azide&#xff1f; 品牌&#xff1a;星戈瑞 CAS号&#xff1a;2055138-89-9 外观&#xff1a; 暗红色晶体 分子量&#xff1a;720.83 分子式&#xff1a;C34H45N6NaO8S2 纯度&#xff1a;95% 储藏条件&#xff1a;-20C 下避光保存 Sulfo-Cyanine3 azide 是一种…...

十大经典排序算法(下)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.6 快速排序 1. 算法步骤 2. 动图演示 3.代码实现 1.7 堆排序 1. 算法步骤 2. 动图演示 3. 代码实现 1.8 计数排…...

网络协议分析期末复习(四)

目录 0.前言 1.IP层对改善TCP性能支持的机制 2.TCP防止半开放连接的机制 3.TCP协议中强推位&#xff08;P&#xff09;和紧急位&#xff08;U&#xff09;的用法 4.TCP的流量控制和拥塞控制的异同点 异&#xff1a; &#xff08;1&#xff09;两者的特点不同&#xff1a;…...

利用最小二乘法找圆心和半径

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

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...