JAVAEE初阶相关内容第二十弹--HTTP协议

写在前:2024年啦!新的一年要努力学习啦

本篇博客围绕HTTP协议,对HTTP协议进行了解,需要理解其工作过程,对HTTP协议格式要清楚,通过抓包工具进行协议分析,认识“方法”、“请求报头”,后续还会进一步对HTTP这部分内容继续更新。

目录

1. HTTP协议是什么

2. 理解HTTP协议的工作过程

3. HTTP协议格式

3.1 抓包工具的使用

3.2 抓包工具的原理

3.3 抓包结果

3.3.1 【请求】 Request

(1) 认识URL

(2) URL基本格式

3.3.2 【响应】

3.4 认识“方法”

3.4.1 GET方法

(1) 认识GET请求

(2) GET特点

3.4.2 POST方法

(1) 认识POST

(2) POST特点

3.4.3 其他方法

3.4.4 面试题--谈谈GET和POST的区别

3.5 认识请求“报头”(header)

3.5.1 Host

3.5.2 Content-Length

3.5.3Content-Type

3.5.4 User-Agent(UA)

3.5.5 Referer

3.5.6 Cookie

(1) Cookie从哪来

(2) Cookie在哪存

(3) Cookie到哪去


1. HTTP协议是什么

超文本传输协议,属于应用层协议。

HTTP往往是基于传输层的TCP协议实现的(HTTP1.0,HTTP1.1,HTTP2.0均为TCP,HTTP3基于UDP实现),我们平时打开一个网站,就是通过HTTP协议来传输数据的。目前我们使用的还是HTTP1.1。

当我们在浏览器中输入一个网址(URL)时,浏览器就会给服务器发送一个HTTP请求,服务器返回一个HTTP响应。这个响应结果被浏览器解析后,就展示成了我们看到的页面内容。所谓“超文本”,就是传输的内容不仅仅时文本(比如html、css这个就是文本),还可以时一些其他的资源,比如图片、视频、音频等二进制的数据。

2. 理解HTTP协议的工作过程

当我们在浏览器中输入一个“网址”,此时浏览器就会给对应的服务器发送一个HTTP请求,对方服务器收到这个请求后,经过计算处理,就会返回一个HTTP响应。

3. HTTP协议格式

3.1 抓包工具的使用

http协议的交互详细过程,可以借助第三方工具来看到,这里我们使用的是Fiddler

关于Fiddler

fiddler本质上是一个代理程序,使用的时候需要注意两点:

(1)可能和别的代理程序冲突,使用的时候要关闭其他的代理程序【包括一些浏览器插件】

(2)要想正确抓包,还需要开启https功能。 https是基于http搞出来的进化版协议,当下互联网上绝大部分的服务器都是https的,fiddler默认不能抓https的包,需要我们手动启用一下https并且安装证书。

3.2 抓包工具的原理

Fiddler相当于一个代理,浏览器在访问baidu.com的时候就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给baidu服务器返回数据,Fiddler拿到返回数据,再把数据交给浏览器。

3.3 抓包结果

以下是一个HTTP请求/响应的抓包结果

3.3.1 【请求】 Request

首行:[方法]+[url]+[版本]

[Get]:方法 Method

[url]:唯一资源定位符,描述资源在哪,具体地址。协议名称://ip:端口号/路径?查询字符串

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

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

(1) 认识URL

平时我们俗称的“网址”,其实说的就是URL(Uniform Resource Locator 统一资源定位符)

互联网上的每个文件都有一个唯一的URL。它包含的信息指出文件的位置以及浏览器应该怎么处理它。

(2) URL基本格式

3.3.2 【响应】

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

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

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

关于HTTP报文中存在的空行:

因为HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于是“报头的结束标志”,或者是”报头和正文之间的分隔符“。

HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现”粘包问题“。

3.4 认识“方法”

3.4.1 GET方法

(1) 认识GET请求

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

在浏览器地址栏中直接输入URL

html里的link,script,img,a......

通过js来构造get

(2) GET特点

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

关于query string

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

3.4.2 POST方法

(1) 认识POST

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

(2) POST特点

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

3.4.3 其他方法

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

3.4.4 面试题--谈谈GET和POST的区别

(1) GET也可以给服务器传递一些信息,GET传递信息一般都是放在query string中,POST传递消息则是通过body。

(2) 语义上的差别:GET请求一般是用于从服务器获取数据。POST一般是用于给服务器提交数据。

(3) GET通常会被涉资成幂等的,POST不要求幂等。【幂等:相同的输入,得到的结果也是确定的】

(4) GET可以被缓存,POST一般不能被缓存(把请求的姐夫哦保存下来,下次请求就不必真请求了,直接取缓存的结果)

GET和POST没有本质区别(在大部分场景下,彼此之间能相互替代)。完全可以使用GET提交,使用POST获取。也可以把POST设置成幂等,GET不幂等。

3.5 认识请求“报头”(header)

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

3.5.1 Host

表示服务器和主机的地址和端口。描述最终要访问的目标,大多数情况下和URL一样。

3.5.2 Content-Length

表示body中的数据长度。

3.5.3Content-Type

表示请求的body中数据格式

如果是GET请求,没body,请求中没有这俩字段;如果是POST请求,有body,请求中必须有这俩字段。

3.5.4 User-Agent(UA)

描述了浏览器和操作系统的版本,区分PC和移动。

3.5.5 Referer

表示这个页面是从哪个页面跳转过来的,如果直接通过地址栏输入地址或者是点击收藏夹,都是没有referer的。

3.5.6 Cookie

Cookie是非常重要的header属性,本质上是浏览器给网页提供的本地存储数据的机制。网页默认是不允许访问计算机硬盘的(保证安全),Cookie中存储了一个字符串,这个数据可能是客户端(网页)自行通过JS写入的,也可能来自于服务器(服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回数据)

Cookie浏览器对于访问硬盘做了明确的限制,Cookie就是通过键值对的方式来组织数据的。

(1) Cookie从哪来

Cookie中的数据是来自于服务器,服务器会通过HTTP响应的报头部分(Set-Cookie字段) 服务器来决定,浏览器的Cookie要存什么。

(2) Cookie在哪存

可以认为是存在于浏览器中。存在于硬盘的。Cookie在存的时候,是按照浏览器 + 域名维度来进行细分的,不同的浏览器,各自存各自的Cookie,同一个浏览器不同的域名,对应不同的Cookie。Cookie中的内容不仅是键值对,同时还有过期时间。比如,有很多网站,登录一次后自动记录登录状态。

(3) Cookie到哪去

Cookie会回到服务器这里,客户端同一时刻是有很多的,客户端会通过Cookie来保存当前用户使用的中间状态,当客户端访问浏览器的时候,就会自动的把Cookie的内容带入到请求中,服务器就能够知道现在的客户端是啥样的。

接下来将会学习构造HTTP请求、HTTPS等知识。

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

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

相关文章

打造绿色饲养链:河南恩珅德农业引领可持续农业发

在河南恩珅德农业的引领下,可持续农业的概念得到了更进一步的实践和推动。其致力于打造绿色饲养链的努力,旨在通过创新的理念和科技手段,实现饲养业的可持续发展。本文将深入探讨河南恩珅德农业是如何引领可持续农业发展,打造绿色…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转: 依赖对象的获得被反转了,于是依赖反转更名为:依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用,如果这个获取过程需要自身…

mysql的读写分离

MySQL 读写分离原理 读写分离就是只在主服务器上写,只在从服务器上读。 主数据库处理事务性操作,而从数据库处理 select 查询。 数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。 常见的mysql读写分离分为以下两种 1&…

贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

1. 贝叶斯推断 统计推断这件事大家并不陌生,如果有一些采样数据,我们就可以去建立模型,建立模型之后,我们通过对这个模型的分析会得到一些结论,不管我们得到的结论是什么样的结论,我们都可以称之为是某种推…

day5--java基础编程:异常,内部类

6 异常 6.1 异常概述 出现背景: 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式&#xff0c…

React使用动态标签名称

最近在一项目里(React antd)遇到一个需求,某项基础信息里有个图标配置(图标用的是antd的Icon组件),该项基础信息的图标信息修改后,存于后台数据库,后台数据库里存的是antd Icon组件…

QT上位机开发(会员管理软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们学习了ini文件的解析办法,通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外,另外一种经常出…

将 Python 和 Rust 融合在一起,为 pyQuil® 4.0 带来和谐

文章目录 前言设定方向从 Rust 库构建 Python 软件包改装 pyQuil异步困境回报:功能和性能结论 前言 pyQuil 一直是在 Rigetti 量子处理单元(QPUs)上构建和运行量子程序的基石,通过我们的 Quantum Cloud Services(QCS™…

Ansible、Slatstack、Puppet自动化运维工具介绍

一、自动化运维工具的选择 1、为什么要用自动化运维工具? 运维的痛点: 海量的设备越来越多,每台设备单独管理需要投入更多人力; 传统运维效率低,大多工作人为完成; 传统运维工作繁琐,人工操作容易出错…

搭建宠物寄养小程序流程

近日,一地宠物寄养需求旺盛,元旦满房,春节几近饱和,一窝难求。随着市场需求的增长,对于很多宠物行业的商家,可以考虑开展宠物寄养服务,尤其是节假日的宠物寄养需求会更高。因此,商家…

uniapp中uview组件库的Input 输入框 的使用方法

目录 #平台差异说明 #基本使用 #输入框的类型 #可清空字符 #下划线 #前后图标 #前后插槽 API #Props #Events #Methods #Slots 去除fixed、showWordLimit、showConfirmBar、disableDefaultPadding、autosize字段 此组件为一个输入框,默认没有边框和样式…

东信免驱系列身份证阅读器串口通讯协议解析示例,适用于单片机、ARM等系统开发集成使用

完整的一次读卡流程包括: 身份证寻卡 > 身份证选卡 > 身份证读卡,三个步骤 缺一不可(见通讯协议)。 寻卡:EA EB EC ED 04 00 B0 B4 BB 返回:EA EB EC ED 05 00 00 B0 B5 BB 选卡:EA …