网络编程-网络原理HTTP1

文章目录

  • HTTP请求/响应的基本结构
  • 认识URL
    • URL是什么和基本格式
    • 关于encoding机制
  • 认识方法(method)
    • GET方法简介
    • GET方法的特点
    • POST方法简介
    • POST方法的特点
    • GET和POST的区别(经典面试题)
    • 关于GET和POST的补充说明
    • Restful风格


上节主要是对http协议的一些最基本的概念做出一些说明, 然后简单介绍了一下如何使用fiddler进行对http请求的抓取, 本节我们更加细致的解释一下HTTP的报文格式相关的问题


HTTP请求/响应的基本结构

我们抓一个包来简单查看一下

请求的基本结构如下

在这里插入图片描述

我们的HTTP请求分为下面的几个部分

  • 首行: 请求方法 + URL + 协议版本号
  • 请求头(header): 由键值对组成的结构
  • 空行: 作为header的结束标志, 分割请求头和正文
  • 正文(body): 可以携带信息, 可有可无的存在

响应的基本结构如下

在这里插入图片描述
和请求类似, 也分为四个部分

  • 首行: 协议版本号 + 状态码 + 状态码解释
  • 响应头(header): 由键值对组成的结构
  • 空行: 作为header的结束标志, 分割响应头和正文
  • 正文: 可以携带信息

认识URL

URL是什么和基本格式

URL的全程是Uniform Resource Locator 统⼀资源定位符, 描述了资源在网上的存在路径, 也就是说, 根据URL就可以找到某一个网络上的资源


URL的基本格式如下

协议方案名+(登录信息)+服务器地址(ip(域名)+端口号)
+带层次的文件路径+查询字符串(Quary String)+(片段标识符)

在这里插入图片描述

登录信息现在基本上不用了, 片段标识符用的也很少(文档类的网站还有)


我们拿访问leetcode平台的URL举例子

https://leetcode.cn/

我们访问的leetcode官网, 发现只有, 协议方案名+服务器地址(域名)

这说明URL中的好多内容都是可以省略的, 下面是URL中的内容以及是否可以省略

  • 协议方案名: 明确了当前通信使用的协议, 可以省略, 省略后默认是http://
  • ip地址/域名: 描述了请求的服务器的ip地址(域名), 可以省略, 在html中
  • 端口号: 描述了请求的服务器的目的端口, 可以省略, 省略之后相当于添加默认的端口号, http->80, https->443
  • 带层次的文件路径: 描述了请求的资源的更加具体的地址, 可以省略. 省略后相当于 / .
  • 查询字符串(Quary String): 使用键值对的格式进行存储, 详细的描述了请求的信息内容, 也可以传递一定的信息, 必要时使用encoding进行转码, 可以省略
  • 片段标识符: 可以省略

我们在使用leetcode平台抓一个URL看看

我们搜索了一个 'N皇后'
https://leetcode.cn/search/?q=N%E7%9A%87%E5%90%8E 

上面的URL中, 有 协议名称+域名(ip)+查询字符串(encoding转码了)


关于ip和域名的关系, 其实就是一回事, 因为ip地址不好被人们所记住使用, 所以想出来使用域名来代替ip地址, 二者通过一种叫做DNS应用层协议进行连接, 值得注意的是
DNS既是一种应用层协议, 也是一套服务器系统, 用来IP和域名之间的相互转换

我们想查询域名所对应的IP地址, 可以在cmd命令行中使用ping命令

ping + 域名

比如我们想查询 leetcode 平台域名对应的 ip 地址

在这里插入图片描述


关于空行的作用(这也是一个常见的面试题)

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

关于encoding机制

因为URL在定义的时候, 有一些特殊的字符, 可能会影响解析的过程

所以一旦涉及到一些特殊的字符, 那可能就需要进行转码encoding操作, 即把转义的字符, 按照每个字节进行十六进制的转码, 然后在每一个字节前面加上%.

发送到服务器之后, 再进行decoding操作, 对转码的内容, 进行解码 从而可以找到对应的资源

但是发送到服务器之后, 进行decoding的操作, 一般都省略了, 因为我们开发中经常使用的spring系列的框架, 对这里的内容进行封装, 封装了解码的过程…


在浏览器上搜索C++

在这里插入图片描述
我们拿到上面的URL进行查看…
在这里插入图片描述
由于+号是特殊字符, 所以此处进行了URL encoding, 查询字符串中的C++变成了C%2B%2B
因为+对应的十六进制编码就是2B, 除了这种特殊符号, 包括一些非英文的语言(比如中文), 表情包, 也会进行encoding操作, 比如我们上面查询的N皇后就是使用了转码操作…


我们给一个URL解码的网站

URL解码

在这里插入图片描述
我们尝试解码上面的leetcode上的查询内容, 就会发现, 其实就是N皇后…

认识方法(method)

上面我们说到, 在请求的首行里面, 格式是请求方法+URL+协议版本号

方法表示了这个请求的相关作用

在这里插入图片描述
不同的方法代表不同的含义, 但是最常见的只有四个GET POST PUT DELETE
最常用的是 GETPOST

GET方法简介

GET方法的含义是, 获取某一种资源, 我们现在抓一个GET的请求看一看
尝试访问一个搜狗的网页

请求
在这里插入图片描述
响应
在这里插入图片描述
上面是使用GET请求获取到了一个网页的请求和响应


GET方法的特点

  • 首行的第一部分是GET
  • URL的Quary String可以为空, 也可以不为空
  • header部分有若干键值对结构
  • body部分为空(也可以不为空)
  • GET一般是幂等的…(一般情况)
  • body一般是空的, 如果需要给服务器发送一些数据, 可以通过Quary String进行传输

关于URL的长度问题

下面是引用的解释

关于 GET 请求的 URL ⻓度问题
⽹上有些资料上描述: get请求⻓度最多1024kb 这样的说法是错误的.
HTTP 协议由 RFC 2616 标准定义, 标准原⽂中明确说明: “Hypertext Transfer Protocol – HTTP/1.1,”
does not specify any requirement for URL length.
没有对 URL 的⻓度有任何的限制.
实际 URL 的⻓度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最⼤⻓度
是不同的, 但是现代浏览器⽀持的⻓度⼀般都很⻓; 在服务器端, ⼀般这个⻓度是可以配置的.

简单点说, 早期的浏览器版本不支持非常长的URL长度, 但是现在的URL以及完全没有长度的限制了…


关于为什么通常情况下GET方法设置为幂等的问题

幂等的含义就是, 同一个请求获取到的数据是相同的, 由于我们从服务器端获取到的数据, 通常情况下是相同的, 所以设置为幂等之后,
我们的本地就会缓存从服务器加载过来的数据, 从而在下次加载相同的内容的时候, 直接加载缓存到本地的资源就可以了, 从而加速了访问的速度, 传输层面的话, 也可以通过访问CDN服务器来加快访问服务器的过程(本质上是一种分布式存储机制)
如果真的想从新获取一遍资源, 就使用 ctrl + F5 强刷一下

但是随着互联网技术的进步, 很多时候, GET请求通常不设置为幂等的, 因为我们通常需要你的个性化推送这就意味着不能设置为幂等的…

POST方法简介

POST的语义是传输某一种数据信息, 通常使用body部分进行数据的传输, 关于POST最常见的场景就是, 登录, 上传
我们尝试抓取一个POST的信息来看一看

请求
在这里插入图片描述
响应

在这里插入图片描述

POST方法的特点

  • 首行的第一部分是POST
  • URL的Quary String一般为空(也可以不为空)
  • header部分有多个键值对结构
  • body部分一般不为空, 通过body来向服务器端传递信息

GET和POST的区别(经典面试题)

请你说说 GETPOST 的区别是什么

  • 语义不同:
    GET表示从服务器端获取一些资源, POST表示向服务器端提交一些资源
  • bodyQuary String 部分的不同
    GET请求的body部分通常为空(也可以不为空), POST的body部分通常不为空(也可以为空)
    GET请求的Quary String通常不为空(也可以为空), POST的Quary String通常为空(也可以不为空)
  • 传递数据方式的不同
    GET通过Quary String中的内容传递数据信息, POST通过body传递数据信息
  • 是否幂等(上面GET那里有解释)
    GET请求一般是幂等的, POST请求一般是不幂等的
  • 是否可以被缓存(和幂等相关)
    GET请求可以被缓存, POST请求不能被缓存

关于GET和POST的补充说明

  • 关于语义
    GET完全可以上传资源(通过Quary String), POST方法也可以获取资源(通过body), 所以在实际的开发中, 两个方法的使用并没有明确的界限

  • 关于幂等性
    GET的官方文档建议设置为幂等的, 但是我们实际的开发中也可以根据自己的需求进行开发, 比如主流的网站都有猜你喜欢功能…

  • 关于安全性
    有些资料说, GET不如POST安全, 这实际上是不合理的, 比如在登录的场景, 他的意思其实是, 如果使用GET进行传输, 密码信息会直接显示到浏览器的上面的地址栏, 所以不安全, 这显然是一种掩耳盗铃的说法…即使你通过POST传输, 我抓一个包也就全知道了, 所以POST也不是很安全, 我们正确的加密传输的方案是在业务层直接进行加密(HTTPS只能保证传输过程中是安全的)

  • 关于传输数据量
    有些资料说, GET传输的数据量不如POST多, 这实质上也是不严谨的, 我们现在的官方标准, 并没有规定GETURL的长度, 也没有规定POST中的body长度, 传输的数据量多少, 完全取决于不同浏览器和服务器的实现, 所以不能简单的说谁比谁传输数据少

  • 关于传输资源类型
    有的资料说, GET只能传输文本数据, POST不仅可以传输文本还可以传输二进制数据, 确实, GET中的URL中的Quary String只能是文本数据, 但是我们要想实现传输二进制的效果, 可以对二进制数据进行URL encoding操作转换为文本数据, 然后传输之后再进行decoding操作进行解码即可


Restful风格

尽管我们的方法之间并没有明确的界限, 但是我们还是遵循一套大致的流程, 分别CRUD操作

  • POST: 新增
  • DELETE: 删除
  • GET: 查询
  • PUT: 修改

在实际的开发中, 我们也可以尽量的遵循这种Restful设计风格来实现代码…

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

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

相关文章

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量,分布函数(Cumulative Distribution Function, CDF)是概率密度函数(Probability Density Function, PDF)的变上限积分,概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题&#xff0c…

【落羽的落羽 数据结构篇】算法复杂度

文章目录 一、数据结构和算法简介二、算法复杂度1. 时间复杂度2. 空间复杂度 一、数据结构和算法简介 数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学…

22_解析XML配置文件_List列表

解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署&#xff08;CI/CD&#xff09;领域&#xff0c;GitHub Actions 曾是众多开发者的热门选择&#xff0c;但如今&#xff0c;其弊端逐渐显现&#xff0c;让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成&#xff0c;采用基于主干的开发方式&am…

Leetcode-两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

MySQL安装教程

一、下载 点开下面的链接&#xff1a;下载地址 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.34 的软件本体了(就是一个文件夹)&#xff0c;我们可以把它放在你想…

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…

INCOSE需求编写指南-第1部分:介绍

第1部分&#xff1a;介绍Section 1: Introduction 1.1 目的和范围 Purpose and Scope 本指南专门介绍如何在系统工程背景下以文本形式表达需求和要求陈述。其目的是将现有标准&#xff08;如 ISO/IEC/IEEE 29148&#xff09;中的建议以及作者、主要贡献者和审稿员的最佳实践结…

基于神经网络的视频编码NNVC(1):帧内预测

在H.266/VVC发布后&#xff0c;基于传统编码框架提升压缩率越来越难&#xff0c;随着深度学习的发展&#xff0c;研究人员开始尝试将神经网络引入编码器。为此&#xff0c;JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究&#xff0c;工…

深入探究分布式日志系统 Graylog:架构、部署与优化

文章目录 一、Graylog简介二、Graylog原理架构三、日志系统对比四、Graylog部署传统部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置详情六、优化网络和 REST APIMongoDB 七、升级八、监控九、常见问题及处理 一、Graylog简介 Graylog是一个简单易用、功能较全面的…

寒假1.23

题解 web&#xff1a;[极客大挑战 2019]Secret File&#xff08;文件包含漏洞&#xff09; 打开链接是一个普通的文字界面 查看一下源代码 发现一个链接&#xff0c;点进去看看 再点一次看看&#xff0c;没什么用 仔细看&#xff0c;有一个问题&#xff0c;当点击./action.ph…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …

微信小程序1.1 微信小程序介绍

1.1 微信小程序介绍 内容提要 1.1 什么是微信小程序 1.2 微信小程序的功能 1.3 微信小程序使用场景 1.4 微信小程序能取代App吗 1.5 微信小程序的发展历程 1.6微信小程序带来的机会

STM32 GPIO配置 点亮LED灯

本次是基于STM32F407ZET6做一个GPIO配置&#xff0c;实现点灯实验。 新建文件 LED.c、LED.h文件&#xff0c;将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件&#xff0c;这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…

vulnhub靶场【kioptrix-3】靶机

前言 靶机&#xff1a;kioptrix-3&#xff0c;IP地址为192.168.1.74 攻击&#xff1a;kali&#xff0c;IP地址为192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 文章中涉及的靶机&#xff0c;来源于vulnhub官网&#xff0c;想要下载&#xff0c;可自行访问官网下载&a…

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…

VMware虚拟机安装Linux系统(openKylin)

首先打开VMware Workstation&#xff0c;点击创建新的虚拟机。 进入虚拟机引导界面后&#xff0c;选择“典型”选项&#xff0c;点击下一步&#xff1b; 选择“稍后安装操作系统”&#xff0c;点击下一步&#xff1b; 客户机操作系统选择“Linux”&#xff0c;版本选择Ubuntu 6…