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

news2024/11/16 10:26:40

一.认识请求方法(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.coloradmin.cn/o/1928413.html

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

相关文章

【实战:Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警】

1 Django中集成方式一(通用方案) 1.1 把上面的包-复制到djagno项目中 1.2 在views中编写视图函数 1.3 配置路由 1.4 浏览器访问,提交任务 1.5 启动worker执行任务 1.6 查看任务结果 2 Django中集成方式二(官方方案&#xff0…

25_Vision Transformer原理详解

1.1 简介 Vision Transformer (ViT) 是一种将Transformer架构从自然语言处理(NLP)领域扩展到计算机视觉(CV)领域的革命性模型,由Google的研究人员在2020年提出。ViT的核心在于证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效&…

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及,智能合约作为其核心应用之一,在金融科技(FinTech)领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例,以及面临的技术挑战和发展趋势,旨在帮助读…

redis笔记2

redis是用c语言写的,放不频繁更新的数据(用户数据。课程数据) Redis 中,"穿透"通常指的是缓存穿透(Cache Penetration)问题,这是指一种恶意或非法请求直接绕过缓存层,直接访问数据库或…

HouseCrafter:平面草稿至3D室内场景的革新之旅

在室内设计、房地产展示和影视布景设计等领域,将平面草稿图快速转换为立体的3D场景一直是一个迫切的需求。HouseCrafter,一个创新的AI室内设计方案,正致力于解决这一挑战。本文将探索HouseCrafter如何将这一过程自动化并提升至新的高度。 一、定位:AI室内设计的革新者 Ho…

通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制

前言 前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。 TLV数据之协议解析 紧着…

爬虫学习 | 01 Web Scraper的使用

目录 背景介绍: 第一部分:Web Scraper简介 1.什么是Web Scraper: Web Scraper🛒 主要用途: 2.为什么选择Web Scraper: 第二部分:安装Web Scraper ​​​​​1.打开google浏览器&#xf…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…

redis讲解与介绍

Redis介绍: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列&#x…

linux adb命令

⏩ 大家好哇!我是小光,正在努力寻找自己的职业方向。 ⏩ 在调试设备时,经常会用到adb命令,本文对linux adb命令做一个知识分享。 ⏩ 感谢你的阅读,不对的地方欢迎指正。 1.adb命令 即 Android Debug Bridge 是一种允许…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注:机翻,未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时,…

数据库:编程(打开、操作(增、删、改、查)、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增,删,改,查) 》关闭数据库 3.1 打开数据库: sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

docker持久化

上周学习了docker的dockerfile,这周会往下学习一下docker的持久化;提到持久化,首先会涉及到一个UnionFS的概念; 1、什么是UnionFS? docker创建镜像的时候,会将各种依赖包括操作系统OS、工具包、依赖库等都放在文件系…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) 这三个基本要求,最多只能同时满足…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件传参 (以下为错误示例) 3.事件传参与数据同步 4.条件渲染 …

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量: QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说:现在有个word文档,里面有个表格太长(如下图所示),希望这一个设置成横的,其余页还是保持竖的! 二、解决方案 1、将鼠标放置在该页的最前面闪烁,然后选择“页面”》“↘…