HTTP背后的故事:理解现代网络如何工作的关键(二)

一.认识请求方法(method)

1.GET方法

请求体中的首行包括:方法,URL,版本号

方法描述的是这次请求,是具体去做什么

GET方法:

1.GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。

2.在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.

GET 请求的特点
  • 首行的第一部分为 GET
  • URL query string 可以为空, 也可以不为空.
  • header 部分有若干个键值对结构.
  • body 部分为空.

2.POST方法

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

通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript ajax 也可以构造 POST 请求.

两个非常经典使用POST场景
1.登录

2.上传

登录码云时

POST 请求的特点
  • 首行的第一部分为 POST
  • URL query string 一般为空 (也可以不为空)
  • header 部分有若干个键值对结构.
  • body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由
  • header 中的 Content-Length 指定.


 3.GET和POST

 我们知道请求体的基本格式包含四个部分:首行,请求头(Header),正文(Body),空行

在正文body中,body是你可以存放任意格式的数据,只有前端和后端约定好即可,从使用习惯上说,GET没有body,POST含有body,GET会把需要给服务器的补充信息放到query string中(url)

POST会把这些信息放到body中。

对于GET和POST在使用习惯上还是有明显区别的

1.GET习惯于把数据放到url中的query string中,POST习惯于把数据放到body中。

GET也可以把数据放到body中,POST也可以把数据放到query string,大部分服务器和浏览器都适用,注意我说的是大部分。 

2.语义上的区别,在标准文档中,GET的语义是用来获取数据,POST的语义是给服务器传输数据

但实际使用不一定拘泥于上述要求 

3.关于幂等性,在标准文档中,建议GET请求实现成幂等的,POST则无要求。

什么是幂等?

1.每次输入的内容一定,输出的结果也一定,称之为幂等。

2. 每次输入的内容一定,输出的结果不一定,不是为幂等。

GET在实际开发中也可以不实现幂等

4.GET请求是可以被浏览器收藏夹收藏的,POSt请求不可以。


网上的以下说法不太准确,这里做些补充。

1.POST比GET更安全,因为在登录时,如果使用GET,用户名密码就会显示url中,此时会被别人看见,显得不安全。

但其实是POST,数据没有显示在url中,也是可以被黑客通过抓包获取到的,真正保证安全性关键在于加密,如果数据加密了,就算放到url显示又如何呢?

2.GET传输的数据量小(存在上限),POST传输的数据量更大

这描述的是在以前,实际上HTTP标准文档上明确说了,对于GET,url的长度不受限制,之前老版本的IE浏览器在实现的时候,url长度确实是有限制,不过这是放在以前,现在比较长的url也是很常见的

3.GET 只能携带文本数据,POST 则可以携带二进制数据

这个说法不能说是完全错误,确实有一定的局限性的.
URL 通过 query string 来携带数据
query string 是只能包含文本的. 但是可以对二进制数据进行 urlencode(转码),自然就成了文本了
到了服务器自然进行 urldecode(解码), 就能把数据还原成二进制.
POST 请求 body 中也经常不是直接携带二进制
也有很多时候是对二进制数据进行 urlencode/ base64 等方式进行转码

 4.其他方法

实际上,这些方法的语义是属于标准文档作者的制定原则,Http 是应用层协议,开发者在实际开发时,完全可以自己制定“规则”,如上可以在POST来从服务器拿数据,也可以用GET往服务器放数据。甚至可以全用POST。

其他方法

  • PUT POST 相似,只是具有幂等特性,一般用于更新
  • DELETE 删除服务器指定资源
  • OPTIONS 返回服务器所支持的请求方法
  • HEAD 类似于GET,只不过响应体不返回,只返回响应头
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个
  • CONNECT 预留,暂无使用
  • 这些方法的 HTTP 请求可以使用 ajax 来构造. (也可以通过一些第三方工具)

以上用法比较少,绝大部分都是使用GET/POST方法


二.认识请求报头(header) 

1.Host

Host :表示服务器主机的地址和端口.
比如

其实URL 已经包含了 Host 了(gitee.com)
这里的 Host 和 URL 中的 ip 地址 端口,绝大部分情况下都是一样的
少数情况可能不同。


2.Content-Length

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

通过这个长度来处理粘包问题,因为HTTP 底层也是基于 TCP
连续传输多个 HTTP 数据报,此时接收方这边的接收缓冲区里就会积累多个包的数据,应用程序在读取这些数据的时候就需要明确包之间的边界。

3.Content-Type

Content-Type :表示请求的 body 中的数据格式.

 

body 可以传输很多种格式的.包括程序员也可以自己约定任意的格式
但是有些格式是非常常见的,比如

请求中的格式如下:
1. application/json  (body就是json)
2.application/x-www-form-urlencoded(form表单)
3. multipart/form-data (上传文件时使用)

响应中的格式如下:

1. text/plain 纯文本
2. text/html html
3. text/css Css
4. application/javascript js
5. application/json
6. image/png
7. image/jpg


同时响应格式的后面还可以添加编码方式
如:

4 User-Agent(简称UA)  

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

用法有三点: 

1.UA可以根据当时用户使用的设备来正常的打开网站

在上古时期,上古时期,UA 非常关键的部分.不同用户使用的上网的设备,差异很大,(当年计算机发展速度日新月异),同一个时间段内,用户使用新设备和或者是旧设备的情况的会同时存在,旧设备打开新特性的网站是无法正常打开的。

比如你是一个程序员,你要写一个网站,你写的网站是否要使用新的特性呢?
使用新特性,老的设备就无法正常打开
不使用新特性,你这个网站就打打不过竞争对手。

而借助 UA 就能解决上述问题
服务器就可以针对此时的 UA 的信息进行判定。
如果用户用的是很老的设备,返回的页面就不包含新特性, 确保这个页面能够正确访问出来。
如果用户用的是新的设备,返回的页面就包含新特性,确保这个页面体验足够好。

2.根据操作系统的不同来返回对应的页面布局.

UA 里包含了系统信息,就可以判定系统是 PC 的系统还是移动端的系统,此时就可以根据这个信息来返回不同的页面了

不过现在常用的使用响应式布局来进行页面布局。

因为使用UA的话需要维护两段代码(PC端和移动端)

而响应式布局中通过一套代码,就可以适应不同尺寸的显示器

取值的CSS3 提供了一个特性,"媒体查询"
可以感知到当前屏幕的尺寸,根据不同的尺寸,应用不同的样式。

3. 手动把 UA 改成 PC的 UA,手机版就能访问 电脑版 的网页了。


5.Referer

Referer:描述了当前的页面从哪里来的,

以前refer是可以被修改的,比如我是从百度跳转这个广告,可以修改成来自360跳转。这样会属于百度的流量丢失,等于钱丢失。

所以现在的 HTTP S 就能够很好的解决上述问题。
SSL(网络中用于加密的协议),加密就能把 header 和 body 都进行加密网络上传输的就是密文了,运营商要想修改,就得先破解~~,就算你能解密,你也篡改不了(一旦修改就能被用户的浏览器感知到)。

6.cookie 

 Cookie 本质上是一个,浏览器这边本地持久化存储数据的机制,就是把数据存到硬盘里。

在谈及cookie的作用之前,先看看下面两个问题。 

浏览器作为电脑上的一个程序,能否直接读写本地磁盘文件呢?
当然可以! 系统提供了 API 操作文件作为一个程序当然可以调用这些 api 来操作了~


浏览器上运行的网页,能否通过浏览器提供的 api 来读写本地磁盘文件呢?

可以,理论上完全可行,但是浏览器禁止了这种做法.(浏览器并没有给网页提供这样的 api)
一个网页不能直接的读写你的硬盘文件。这是为了安全性!假如你打开一个网站,随手一点就打开了
一个黑客搞的恶意网站,此时,人家通过网页直接把你电脑上的所有学习资料都给你一删,必然会造成重大损失!!

但是确实,有些网站,是需要把一些信息保存到浏览器这边的,比如当前登录的用户的身份信息.

那怎么办捏,如下

HTTP 请求中的 Cookie 字段, 就是把本地存储的 Cookie 信息发送到服务器这边
HTTP 响应中会有一个 Set-Cookie 字段,就是服务器告诉浏览器你要在本地保存哪些信息

格式都是程序员定义的键值对

Cookie的作用:

通过Cookie,网站可以识别并记住用户的身份和会话状态,如登录状态、购物车内容等。这样,用户在不同页面之间跳转时,网站能够持续提供个性化的服务,如保持用户登录状态、显示用户购物车中的商品等。

象你去了一家你常去的咖啡馆。这家咖啡馆为了提供更好的服务,决定用一种小卡片来记住你的喜好。这就是Cookie在Web世界中的类似物。

  • 第一次去咖啡馆:你告诉服务员你喜欢喝拿铁,不加糖。服务员很贴心地拿出一张小卡片,写上你的偏好,然后把这个小卡片(Cookie)给了你,让你下次来时出示。
  • 下次再去:你走进咖啡馆,直接出示了小卡片(Cookie)。服务员看到你的卡片,立刻就知道你的喜好,直接为你准备了一杯不加糖的拿铁,无需你再次说明。

这里的小卡片就像是Web中的Cookie,它帮助咖啡馆(服务器)记住了你的个人喜好(用户数据)

关于Cookie的重要结论:

1.Cookie 从哪里来?

服务器返回给浏览器的.通常都是首次访问/登录成功之后


2.Cookie 到哪里去?

Cookie 会存储在浏览器本地主机的硬盘上. 后续每次访问服务器都会带上。

Cookie不同的客户端,保存的 Cookie 是不同的.即使是同一个主机,使用不同浏览器,Cookie 大概率也不同。


3.Cookie 中存什么? 键值对格式的数据.这里的内容都是程序员自定义的。和 query string 一样外人无从理解,不同网站的Cookie的都是不一样的


4.Cookie 在浏览器这边如何组织?在硬盘本地保存,是按照不同的域名为维度分别存储,不如你的浏览器访问百度,有一组 cookie 访问搜狗,也有一组 cookie。

5.Cookie用途用来在客户端保存数据,其中最重要的是保存用户的身份标识!!服务器就可以通过标识来区分用户。

一些其他的业务数据一般不会存到cookie中 ,cookie 随时可以删除掉,把业务数据存储在服务器,通过 cookie 中的身份标识找到对应的数据
 

浏览器的另一个保存机制,一般账号密码不会在 cookie 中保存,cookie 是要传输给服务器的

一般浏览器保存的密码都是明文密码,明文密码放到 cookie 当然不合适,虽然有 https 能加密。https 侧重于是"不能被篡改”而不是"不能被解密。

7.补充

  在使用Fiddler抓包时,为什么有一大块呈现灰色?

为什么下面有一整块都是灰色的呢?

因为浏览器和服务器之间要进行多次网络交互,整体的过程是比较低效的,为了提升效率,就会把一些固定不变的内容在浏览器本地的机器硬盘上进行缓存. 例如css,图片,js等,它们是很少发生改变,将这些保存到硬盘上之后,后续再请求,就可以直接从硬盘上读取数据,减少了网络交互的开销.(网络带宽可是比cpu还贵的资源)。

小技巧:使用 ctrl + F5 强制刷新就可以不读取缓存,直接读取服务器数据。

如图

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

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

相关文章

算法 —— 快速幂

目录 P1045 [NOIP2003 普及组] 麦森数 P1226 【模板】快速幂 原理I 原理II P1226 代码解析 P1045 代码解析 P1045 [NOIP2003 普及组] 麦森数 本题来自洛谷:P1045 [NOIP2003 普及组] 麦森数,根据题意,我们可以看到本题需要计算最少2的1…

C语言程序设计实验8实验报告

1.实验目的 (1)掌握循环语句 (2)学习使用递归 (3)学习使用程序调试 2.实验内容、算法、流程图及主要符号说明 (1)用辗转相减求最大公约数的递归定义是&a…

基于JAVA的智慧社区信息管理系统设计

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【Android高级UI】PorterDuffMode颜色混合公式

效果展示 色彩混合公式 参数说明 S,源图形D,目标图形A,透明度C,RGB色Saturate,饱和度

PingRAT:一款基于ICMP的隐蔽型C2流量转发工具

关于PingRAT PingRAT是一款基于ICMP的隐蔽型C2流量转发工具,该工具专为红队成员和攻防演练任务而设计,主要利用了ICMP Payload来实现其功能,该工具不仅能转发C2流量,而且还可以帮助广大研究人员增强C2网络通信流量传输的隐蔽性。…

SWDIO管脚作为GPIO

下面是使用FRDM-K32L2B3开发板和SDK中的frdmk32l2b_gpio_led_output程序做了一些测试,configure SWDIO pin as GPIO pin的流程。 查看手册,找到SWDIO对应的管脚,可以看到PTA3对应的SWDIO管脚。 2.修改Demo程序,在程序中设置SWDIO…

【杰理蓝牙开发】AC632 开发板烧录实例

AC632 开发板烧录实例 0. 个人简介 && 授权须知1. 硬件板卡介绍2. 代码烧录2.1 使用USB接口烧录2.2 使用串口烧录 3. 为什么要用烧录器供电? 0. 个人简介 && 授权须知 📋 个人简介 💖 作者简介:大家好&#xff0c…

代码随想录训练营第三十六天 1049最后一块石头的重量II 494目标和

第一题: 原题链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 思路: 首先确认这是一道01背包问题的题目,如何转换:剩下尽可能小的重量,如何剩下呢?跟分割等和子集很…

论文略读:LoRA Learns Less and Forgets Less

202405 arxiv 1 主要思想 LORA相比于全参数训练,学的少,但忘的也少 2 实验分析 2.1 训练的表现 在编程和数学任务中,LoRA相比全参数微调表现出明显的劣势 2.2 遗忘的表现 这边的遗忘,是指在数据集A上预训练,然后在…

18.x86游戏实战-找角色人物名字

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Linux编程乐趣《简单、有趣、好玩的Linux命令》

文章目录 一、黑客帝国(cmatrix)1.1 centOS 手动安装:1.2 . 运行1.3 . 效果 二、cal命令三、htop四、sl:蒸汽火车五、cowsay:会说话的小牛六、boxes七、pv 一、黑客帝国(cmatrix) 1.1 centOS 手动安装: #…

【数学建模与优化】:解析与实践

目录 数学建模概述 1. 什么是数学模型 2. 数学模型的分类 2.1 按应用领域分类 2.2 按建模方法分类 2.3 按是否考虑随机因素分类 2.4 按变量的连续性分类 2.5 按对对象内部规律了解程度分类 2.6 按变量的基本关系分类 2.7 按是否考虑时间变化分类 3. 数学规划及优化模…

易语言数据类型和插入数据类型-cnblog

易语言数据类型 基本数据类型 基本数据类型有6种:数值型、逻辑型、日期时间型、文本型、字节集型(字节型组合)、子程序指针型。数值型:0到9加. 数值型又包括:字节型、短整数型、整数型、长整数型、小数型、双精度小数型。 2.特殊数据 易语言特殊数据类型是指基本数据类型之外的…

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

基于vite的vue脚手架工具整合:ts、jsx、eslint、prettier、stylelint、tailwind...

为了帮助vue新手更高效的学习vue3的基础知识、组件开发以及项目方案整合,小卷给大家整理了一个10分钟搞定《基于vite的vue脚手架工具整合》的教程。所有工具都是目前最新的版本,实践和调试过,没有一行多余的配置。

C语言之qsort函数

一、qsort 1.库函数qsort qsort是库函数&#xff0c;直接可以用来排序数据&#xff0c;底层使用的是快速排序。 qsort函数可以排序任意类型的数据。 2.头文件 #include<stdlib.h> 3.参数讲解 void*类型的指针是无具体类型的指针&#xff0c;这种类型的指针的不能直接解…

逻辑分析仪小试(DOING)

PDD买的&#xff0c;价格很nice 有一个小遗憾&#xff0c;接口是mini-usb&#xff0c;这种线找了半天&#xff0c;终于发出来一根&#xff0c;插上去直接灯就亮了。 网上找了一些教程&#xff0c;才发现这个原来是美国saleae的山寨产品。。。但是群众们都一片叫好。 所以配套…

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…

每日复盘-20240715

20240715 六日涨幅最大: ------1--------300807--------- 天迈科技 五日涨幅最大: ------1--------300807--------- 天迈科技 四日涨幅最大: ------1--------300807--------- 天迈科技 三日涨幅最大: ------1--------300713--------- 英可瑞 二日涨幅最大: ------1--------3007…

广告人的的自白,我们是怎么看“创意”这回事的?

作为广告行业的一员&#xff0c;广告创意确实是这个行业中非常核心且充满魅力的一部分。 创意的本质在于能够触动人心&#xff0c;与目标受众产生共鸣&#xff0c;并且有效地传达品牌或产品的信息。 作为一个多年的广告人&#xff0c;下面是我对创意的来源和什么是成功的创意…