【Http协议②】http协议格式,请求格式,常见请求方法,请求报文,请求正文

news2024/11/19 14:48:46

前言:
大家好,我是良辰丫,上一篇文章我们已经了解过了http协议,这篇文章我将带领大家去学习http协议的一些属性,http协议格式,请求格式,常见请求方法,请求报文,请求正文.跟随我的脚步,一起遨游http的海洋.💞💞

🧑个人主页:良辰针不戳
📖所属专栏:javaEE初阶
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

目录

  • 1. http协议格式
  • 2. http请求格式URL
  • 3. http常见的请求方法
    • 3.1 GET方法
    • 3.2 POST方法
    • 3.3 其他方法
  • 4. 请求报头
    • 4.1 HOST
    • 4.2 Content-Length
    • 4.3 Content-Type
    • 4.4 User-Agent
    • 4.5 Referer
    • 4.6 Cookie
  • 5. http请求正文

1. http协议格式

在上一篇文章中,我们简单的认识了协议的格式以及如何使用fiddler进行抓包.我们先来看一个图,简单的回忆一下http的协议格式.

在这里插入图片描述

  • 首行,也就是请求行.
  • 请求包头header
  • 空行,表示请求报文的结束标记.
  • 请求正文:就是body内容.

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

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

2. http请求格式URL

URL这个关键字想必大家已经见过很多次了,但是这到底是是一个什么东西哦,还是有点不太明白,没关系,我来带大家一起了解.
URL (Uniform Resource Locator 统一资源定位符),我们平时所说的访问某个网址就是访问URL地址
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL 的详细规则由 因特网标准RFC1738 进行了约定.
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎处理它。

协议方案名,登录信息认真,服务器地址,服务器端口号,带层次的文件路径,查询字符串,片段标识符.

在这里插入图片描述

  • URL访问地址的时候,有些信息会被省略.
  • https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的jdbc:mysql )
  • user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略
  • 服务器地址.,可以是一个 “域名”, 域名会通过 DNS 系统解析成一个具体的 IP 地址. (通过 ping 命令可以看到真实的ip地址)
  • 端口号: URL 中端口号被被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用
    哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.
  • /personInf/student : 带层次的文件路径.
  • userId=10000&classId=100 : 查询字符串(query string). 本质是一个键值对结构. 键值对之间使用
    & 分隔. 键和值之间使用 = 分隔.
  • 片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转

GET https://www.baidu.com/ HTTP/1.1

  • GET为HTTP方法,描述了这个HTTP请求的作用,HTTP协议有很多方法,不同的方法有不同的作用.
    GET的作用,是从服务器里面拿东西;POST是向服务器李提交东西.
  • www.baidu.com就是URL地址.
  • HTTP/1.1表示HTTP的版本号.

关于 query string(查询字符串):

  • query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
  • query string的参数一般是键值对结构,使用&分割键值对,使用 = 分割键和值.
  • query string的作用是对请求资源进行细节的补充.

URL 中的可省略部分:

  • 协议名: 可以省略, 省略后默认为 http://
  • ip 地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省
    略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名一致.
  • 端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80; 如果是 https 协议, 端口号自
    动设为 443.
  • 带层次的文件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候自动访问
    /index.html
  • 查询字符串: 可以省略
  • 片段标识: 可以省略

关于 URL encode

  • 像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
    比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
  • 一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成, 虽然在 URL 中没有特殊含义, 但是仍然需
    要进行转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号.
  • 转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

“+” 被转义成了 “%2B”
urldecode就是urlencode的逆过程;
我们在查询C++关键字的时候,会惊喜的发现一个%2B
在这里插入图片描述

3. http常见的请求方法

  • http请求方法有很多,但是常用的有GET与POST两种,其余方法也可能出现,但是这两者经常用.
  • 请求一般看到的是GET.
  • 用到POST右什么呢?登录与上传文件的时候.

在这里插入图片描述

3.1 GET方法

  • GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
  • 在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
  • 另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.

GET 请求的特点:

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

网上有些资料上描述: get请求长度是有限制的 这样的说法是错误的.

  • HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: “Hypertext Transfer Protocol HTTP/1.1,” does not specify any requirement for URL length. 没有对 URL 的长度有任何的限制.
  • 实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最大长
    度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的.

有些资料上还说,POST比GET更安全…
这种说法也是非常错误的,安不安全取决于是否加密,而不是所采用的传输方法.

3.2 POST方法

  • POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(登陆页面).
  • 通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求

POST请求的特点:

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

面试题: 谈谈 GET 和 POST 的区别:

  • 其实,二者没有本质的区别,POST能实现的功能,GET也能实现;GET实现的功能,POST也能实现.在细微之处,二者还是有区别的.
  • 语义不同,GET 一般用于获取数据, POST 一般用于提交数据.
  • GET 的 body 一般为空, 需要传递的数据通过 query string 传递, POST 的 query string 一般
    为空, 需要传递的数据通过 body 传递.
  • GET 请求一般是幂等的, POST 请求一般是不幂等的. (如果多次请求得到的结果一样, 就视为请
    求是幂等的,也可以理解为输入的内容相同,你就会提前知道得到什么结果).
  • GET 可以被缓存, POST 不能被缓存. (前提情况也是幂等).因为可以被缓存,那么GET请求可以被浏览器收藏,POST不能被浏览器收藏.

小结一下:

  • 语义: GET 完全可以用于提交数据, POST 也完全可以用于获取数据.
  • 幂等性: 标准建议 GET 实现为幂等的. 实际开发中 GET 也不必完全遵守这个规则(主流网
    站都有 “猜你喜欢” 功能, 会根据用户的历史行为实时更新现有的结果.
  • 安全性: 有些资料上说 “POST 比 GET 请安全”. 这样的说法是不科学的. 是否安全取决于
    前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.
  • 传输数据量: 有的资料上说 “GET 传输的数据量小, POST 传输数据量大”. 这个也是不科学
    的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少, 完
    全取决于不同浏览器和不同服务器之间的实现区别.
  • 传输数据类型: 有的资料上说 “GET 只能传输文本数据, POST 可以传输二进制数据”. 这个
    也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据
    进行 url encode.

3.3 其他方法

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

4. 请求报头

  • header 的整体的格式是 “键值对” 结构.,每个键值对占一行,键值对之间使用分号隔开,键和值之间使用冒号空格来分割.
  • 这里的键值对可以有很多行,还会使用空格作为结束标记(相当于单链表末尾的NULL).
  • header中的键值对,大部分都是HTTP协议规定的,也有一部分是程序员自己定义的键值对.

4.1 HOST

  • 表示服务器主机的地址和端口.
  • Host:www.baidu.com
    这里的属性描述了浏览器这个请求要访问的服务器是谁,这里可以写地址,也可以写端口号.

在URL中,已经写了访问的服务器是哪一个,为什么在Host里面还要再写一遍呢?

  • 一般而言,URL的域名和Host中的值是相同的.但是当我们在访问服务器的时候,不是直接访问,而是通过相关代理来访问的(这个代理不是指fiddler,而是其它的代理),这里时候,URL的域名和Host的值可能就不同了…
  • URL可以表示当前位置,Host表示最终位置.Host可以确认是否到达了最终位置.

4.2 Content-Length

表示 body 中的数据长度,单位是字节.

4.3 Content-Type

表示请求的 body 中的数据格式.

  • application/json : 描述了数据是按照json的格式组织的.
  • charset=utf8 描述了数据的字符集是哪种.

Content-Type作为请求时的常见写法:

  • json格式.
  • form表单格式.

Content-Type作为响应时的常见写法:

  • text/html
  • text/css
  • application/JavaScript
  • application/json
  • image/jpg
  • image/png

4.4 User-Agent

  • User-Agent (简称 UA),表示浏览器/操作系统的属性.
  • UA在请求中告诉网站自己上网的设备是什么,此时,服务器就可以根据客户端的种类返回不同的属性信息.
  • 随着网络技术飞速发展,各个浏览器之间的区别非常小了,UA也就没有那么重要了.
  • UA目前一个重要的作用是区分用户是手机/PC/平板
    UA能做到区分,但是却不常用.CSS3中提供了"媒体查询"功能,可以根据浏览器窗口的大小设置不同的样式,这种页面开发称为响应式布局(简单了解即可)

在这里插入图片描述

4.5 Referer

  • Referer表示这个页面从哪个页面跳过来的.
  • 直接在地址栏中输入url或者直接点击收藏夹是没有referer的,因为这两种方式不能表示从哪个页面跳转过来的.

在这里插入图片描述

4.6 Cookie

  • Cookie简而言之就是一种身份标识,相当于身份信息.
  • 我们可以理解为医院挂号看病,Cookie可以理解为我们的身体信息卡,记录了我们一些信息.
  • Cookie也是采用键值对的形式,每个键值对代表什么意思呢?我们不得而知,因为这些都是程序员自己定义的内容,只有他们自己知道.
  • Cookie的本质是浏览器在本地存储,用户自定义数据的一种关键机制.

往往浏览器也需要存储一些数据,经常会存储用户的身份信息,比如记住我们的登录账号和密码,方便我们下次快速登录.
怎么存储身份信息呢?

  • 直接存储在硬盘上可以吗?这个当然是不可以的,如果允许网页能够操纵你电脑上的文件,这个时候你不小心点到了木马网站,此时,你的电脑很可能被入侵.
  • 因此呢!为了保证用户上网安全,浏览器会做出限制,禁止网页能直接访问硬盘.
  • 浏览器虽然禁止了直接访问硬盘,但是浏览器提供了Cookie机制,允许网页在浏览器中存储一些自定义的键值对,这些数据通过浏览器提供的api写入指定的文件中.
  • 网页有很多种,比如百度,360,搜狗等.这么多网页我们怎么存储身份信息呢?针对这种情况,我们分开存储身份信息,每个网页存储自己的Cookie(按照域名进行存储),同一个网站共享同一份Cookie,不同的网站都有各自的Cookie.

Cookie怎么诞生:
Cookie是从服务器诞生的,当我们在访问服务器的时候,服务器就会在HTTP响应中,通过Set-Cookie字段中,把Cookie的键值对返回给浏览器,浏览器收到这个数据后,就会在本地存储.

Cookie要去哪

  • Cookie会在下次请求的时候发送到服务器,服务器进行处理识别.
  • Cookie在浏览器这边只是暂存,服务器来让Cookie真正发挥作用.

Cookie的作用:

  • Cookie是浏览器本地存储数据的机制.
  • Cookie存的数据不一定是账号密码,也可能是其它信息,只要是字符串都可以存储.
  • Cookie的存储空间是有限的,不会使用Cookie存储太大的数据.
  • Cookie最典型的作用是存储账号和密码.
  • 一个服务器会和许多客户端进行交互,那么多客户端是如何区分呢?就是通过Cookie进行区分.客户端在登录的时候,服务器识别号客户端的Cookie,把客户信息返回给浏览器,在Cookie中进行保存,下一次客户端访问服务器的时候,拥有这个Cookie进可以直接进行访问(服务器根据这个Cookie识别客户端).

5. http请求正文

http请求正文就是body内容,在这里我们先简单了解一下,等我们学到前后端交互再进行详解.

  • 请求正文中主要包含用户提交的参数信息.
  • 参数由前后端提前约定好,后端服务器根据所传参数做相应的业务处理.

请求体常用的有两种,这两种都属于请求体,Content-Type不同,所使用的也不同.

  • FormData
  • RequestPayload
  • 如果请求头中Content-Type为application/json,那么请求参数会以json格式传递,显示为RequestPayload.
  • 如果请求头中Content-Type为x-www-form-urlencoded或multipart/form-data,那么请求参数会以&分割的格式传递,显示为FormData.

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

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

相关文章

第14届蓝桥杯省赛真题剖析-2023年5月7日Scratch编程初级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第135讲。 第14届蓝桥杯Scratch省赛真题,这是2023年5月7日举办的省赛,比赛仍然采取线上形式。试…

Spring Boot 的 Starter 以及实现一个自定义Starter

一、了解 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中一个重要概念,它是一种提供依赖项的方式,简化 Spring 应用程序依赖管理,将一组相关的依赖项打包在一起,并提供一个依赖项描述文件,使开发人员可以…

视觉-激光融合SLAM :LVI - SAM与LIO - SAM的环境配置

目录 1.LIO-SAM配置 1.1 ROS 安装 1.2 安装gtsam 4.0.2 1.3 安装LIO-SAM 1.4 运行LIO-SAM 2. LVI - SAM安装 2.1 一些依赖库的安装 2.2 安装ceres1.1.14 2.3 安装LVI-SAM 1.LIO-SAM配置 机器:Ubuntu 18.04 内存:>16G CPU:Intel &…

电脑看不了视频?这样做,可以快速解决!

案例:我的电脑播放不了视频,这是什么原因。如何才能在电脑上播放视频?有没有解决的办法? 【我工作和学习都离不开电脑,今天工作的时候,我用电脑打开一个视频,却发现视频无法播放,怎…

擎创动态 | 来自华为的深度认可,擎创再获华为鲲鹏技术认证

在数字中国的信息技术应用国产化进程中,擎创科技除持续投入自主产品研发外,还深度适配了涵盖芯片、服务器、操作系统、数据库、中间件、云服务、应用等领域的国产化产品,与华为的合作适配便是其中重要的一环。近期,擎创夏洛克智能…

Install Prometheus Monitoring On Kubernetes Cluster

目录 Node & Software & Docker Images Lists ​Prometheus introduction Download Kubernetes Prometheus Manifest Files Install Prometheus Monitoring Kubernetes Create a Namespace Create a Cluster Role And Binding It Create a Config Map Create…

lwIP更新记05:核心应用文件移动

从 lwIP-2.0.0 开始,lwIP 开发者将一些核心应用从 contrib 仓库移动到 lwIP 仓库的 src/apps 文件夹。 对比版本 lwIP-1.4.1 和 lwIP-2.1.2 的 src 文件夹内容,可以发现 lwIP 2.1.2 版本多了一个 apps 文件夹。 最开始,也就是 2015 年 10 …

【王道·操作系统】第一章计算机系统概述【未完】

一、 操作系统的基本概念 1.1 概念(定义):什么是操作系统 操作系统operating system,OS:控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方…

LC 谐振电路

LC电路是各种电子设备中的基本电子组件,尤其是在诸如调谐器,滤波器,混频器和振荡器之类的电路中使用的无线电设备中。在学习之前,我们复习一下电感和电容的原理。 电容就是储存电荷的容器,最基本构成是如下图所示的一个…

uniapp使用express连接mysql数据库

一、安装 express 脚手架 使用winR再输入cmd打开命令提示符,输入如下内容全局安装脚手架 npm i express-generator -g 二、在项目根目录下创建服务 可以在命令提示符中cd到自己项目的根目录下,也可以在HBuilder X里内置的终端运行代码 C:\HBuilderProj…

波奇学C++:动态内存管理,new和delete

内存分区 内存可分为栈,堆,静态区/数据段,常量区/代码段 栈:函数栈帧,临时变量,开辟空间 堆:动态申请的数据 静态区/数码段:静态数据,全局变量 常量区/代码段&#x…

django admin后台管理系统上传添加的图片保存到阿里云oss中

目录 一、配置admin上传图片到阿里云oss 二、配置admin后台上传到阿里云oss的图片为自定义名 问题描述:在开发自己的应用/网页前后台时可以调用阿里云oss的接口将图片上传至oss保存和读取,非常方便。但在django自带的admin后台中如何配置添加的图片也上…

视频美颜SDK在直播领域的应用与挑战

目前,视频美颜技术在视频拍摄领域“大展神通”,因为视频美颜SDK可以帮助主播在直播中展现更加美好的形象,吸引更多的观众,并提升用户体验。然而,视频美颜SDK在直播领域的应用也面临着一些挑战。 一、视频美颜SDK在直…

回溯法【2-5】

假设一个推销员问题由下图定义,用回溯法求解 从1号结点出发的相应最短巡回路径(每个顶点刚好到达一次)。若用bestL表示搜索过程中产生的当前最优解,剪枝函数 L 设计为: L 已走过的路径长度 当前结点相关的最短边 所…

ChatGPT提示工程课程,吴恩达OpenAI

Principle 1: Write clear and specific instructions 使用明确的分隔符,是LLM知道这个某个单独的字段。 前提设置: import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopena…

LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

作者:小迅 链接:https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2279048/di-gui-zhu-shi-chao-ji-xiang-xi-by-xun-g-7rfd/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系…

如何使用 VSCode 软件运行C代码

VSCode 的下载和扩展的配置可以参考文章:VSCode 的安装与插件配置。 VSCode 是很好用的编辑器,通过给其配置 MinGW-w64 插件就可以在它上面编译运行C代码了。 在没有配置 MinGW-w64 插件时,在 VSCode 中运行下面的代码后打印如下图所示。 这…

【C语言】C的编译过程预处理

目录 一、 程序的翻译环境和执行环境1、翻译环境预处理编译汇编链接 2、执行环境 二、预处理详解1、预定义符号2、#define#define 语法#define 定义宏#define 替换规则 3、#和##4、宏和函数对比 一、 程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不…

为什么我们拥有庞大的语言模型,而Vision Transformers的规模却很小?

编者按:本文探讨了语言模型为何会比视觉模型的参数数量大得多的原因,并详细介绍了传统ViT训练方法在扩展时出现不稳定性的问题。 为此,本文介绍了如何改进架构以实现扩展,并讨论了实现模型最优状态的方法。同时,如何在…

Docker部署skywalking9.2版本

注意使用docker部署skywalking和使用tar包部署有点不一样OAP和UI需要分别部署原因是: SkyWalking UI 和 OAP 是 SkyWalking 的两个主要组件,它们之间的关系是前端和后端的关系。SkyWalking UI 是一个 Web 应用程序,它提供了一个漂亮的 UI 界面…