【JavaEE】_HTTP请求与HTTP响应

news2025/1/21 8:59:34

目录

1. HTTP协议

2. HTTP请求

2.1 HTTP请求首行

2.2  URL

2.3 HTTP方法

2.3.1 GET请求

2.3.2 POST请求

2.3.3 GET与POST的区别

2.3.4 其他方法

2.4 请求报头header

2.4.1 Host:

2.4.2 Content-Length与Content-Type:

2.4.3 User-Agent(简称UA)

2.4.4 Referer

2.4.5 Cookie

2.5 请求正文body

3. HTTP响应

3.1 响应首行

3.2 报头header

3.3 空行

3.4 正文body


1. HTTP协议

1. HTTP协议一般被称为“超文本传输协议”,即不止可以传输文本,还可以传输图片、音频、视频等二进制数据,是一个应用层协议

2. 浏览器获取到网页就是基于HTTP,可以将HTTP理解为浏览器与服务器之间的交互桥梁,最常见的是HTTP1.1。

3. 应用层协议需要基于传输层协议向上层提供服务,HTTP就是基于TCP协议实现的。

4. 当我们在浏览器中输入一个网址(URL)时,其实就是浏览器给该网址的服务器发送了一个HTTP请求,然后该网址的服务器返回一个HTTP响应,浏览器再把得到的HTML等数据显示出来,即进行渲染;

5. HTTP协议是一个行文本协议(文本与二进制对应),可以直接用记事本等文本编辑器直接打开查看的;

6. HTTP协议报文格式可以借助一些第三方工具查看,这些工具称为“抓包”工具,如:fiddler,打开后可在左栏查看到当前电脑上某个程序使用HTTP和服务器交互的过程:

注:(1)fiddler本质是一个代理程序,可能会与别的代理程序冲突,故而在使用fiddler时需要关闭其他的代理程序,包括一些浏览器插件;

代理分为正向代理与反向代理,其中代表着客户端的代理称为正向代理,代表着服务器的代理称为反向代理;

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

2. HTTP请求

HTTP请求包括四个部分:

(1)首行; (2)请求头(header); (3)空行; (4)正文(body);

如果是GET请求,没有body;如果是POST请求,一般有body

2.1 HTTP请求首行

以在浏览器中访问bilibili为例,抓包结果中,首行内容如下:

首行包括三个部分:

(1)GET:是HTTP的方法;

(2)中间部分是URL(唯一资源定位符,标识互联网上唯一的资源的位置),即俗称的网址;

注:URI是唯一资源标识符,是一个身份标识,为了和别的资源区分开,实际上URL也可以起到身份标识的效果,故而URL也可以视为是一个URI;

(3)HTTP/1.1:是HTTP的版本号;

2.2  URL

因特网标准RFC1738规定URL的详细情况如下:

即: 协议名称://ip:端口号/路径?查询字符串

注:(1)TCP、IP、UDP等协议格式都是RFC系列文档规定的;

(2)URL不是HTTP专属的,很多协议都可以使用URL;

(3)URL中某些部分是可以省略的,以在浏览器页面访问bilibili为例,抓包到的url如下:

① 其中服务器端口号就被省略了,在端口号被省略时,浏览器会提供默认端口,

对于http来说,默认端口是80;

对于https来说,默认是443,

即访问https://www.bilibili.com与访问https://www.bilibili.com:443是相同的;

② / 也是目录,只是非常简短,代表HTTP服务器的根目录,/管理的根目录可以是系统上的任何一个目录;

(可以理解为HTTP服务器是系统上的一个进程,委托这个服务器管理系统上的一个特定目录,这个目录里的资源都可以让外部进行访问)

2.3 HTTP方法

常用的HTTP方法如下:

方法说明
GET获取资源
POST传输实体主体
PUT传输文件
HEAD获得报文首部
DELETE删除文件
OPTIONS询问支持的方法
TRACE追踪路径
CONNECT要求用隧道协议连接代理
LINK建立和资源之间的联系
UNLINE断开连接关系

注:(1)方法描述了这次请求的语义,即要进行的操作;

(2)GET方法最常用,其次是POST方法,其余方法使用频率都远小于这两中方法;

2.3.1 GET请求

1. 在浏览器地址栏里直接输入URL或点击收藏夹就会触发GET请求;

2. HTML中的link标签,script标签,img标签以及a标签等也会触发GET请求;

3. 通过JS也可以构造GET请求;

仍以访问网页版bilibili为例:

2.3.2 POST请求

1. 登录操作进行跳转时会涉及到POST;

2. 上传文件时也会使用到POST;

注:(1)POST的body部分的内容与格式都是程序员自行定义的;

2.3.3 GET与POST的区别

1.信息存放差异:

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

2. 语义差异(数据流动方向差异):

GET请求一般用于从服务器获取数据,POST请求一般用于给服务器提交数据

3. GET通常会被设计成幂等的,但POST则不要求幂等

4. GET是可以被缓存的,POST一般不能被缓存

注:① 以上区别只是习惯用法,GET也可以有body,POST也可以有query string,GET也可以给服务器提交数据,POST也可以从服务器获取数据等等;

② 其实GET和POST就没有本质区别,在大部分场景下彼此之间都可以彼此替代,但在使用习惯上会有差异;

③ 幂等可以理解为相同的输入得到的结果也是确定的;

④ 缓存即保存请求的结果,方便下次请求直接取缓存结果从而节省时间;

2.3.4 其他方法

(1)PUT和POST相似,只是具有幂等特性,一般用于更新;

(2)DELETE删除服务器指定资源;

(3)OPTIONS返回服务器所支持的请求方法;

(4)HEAD类似于GET,只不过响应体不返回,只返回响应头;

(5)TRACE回显服务器端收到的请求,测试的时候会使用到该方法;

2.4 请求报头header

header的整体格式是“键值对”结构,一行是一个键值对,这些键值对都是HTTP事先定义好,有特殊含义的。

常见的报头种类有:

2.4.1 Host:

Host表示服务器主机的地址和端口;

注:此处的地址和端口是用来描述最重要访问的目标,大概率与URL相同,但也有可能不同

2.4.2 Content-Length与Content-Type:

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

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

常见选项:

1. Content-Type:application/json;charset=UTF-8,数据为json格式,body格式形如:

{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
a861fa2bddfdcd15"}

2.Content-Type:application/x-www-form-urlencoded;charset=UTF-8,form标签构造的body格式就是该种类型,body格式如下:

title=test&content=hello

注:如果是GET请求,没有body,则请求中没有以上两个字段;

如果是POST请求,有body,则请求中必须有该两个字段;

2.4.3 User-Agent(简称UA)

1. 表示用户浏览器或操作系统的版本(属性);

2. 如今的UA主要用于区分PC和移动;

2.4.4 Referer

1. 表示当前页面的来源,即当前页面是由哪个页面跳转过来的;

2. 不一定有,如果是直接通过地址栏输入地址,或者直接点击收藏夹等进行访问,就没有Referer;

2.4.5 Cookie

1. Cookie本质是浏览器给网页提供的本地存储数据的机制;

为了保证安全,网页默认是不允许访问计算机硬盘的。

Cookie即对浏览器访问硬盘做出了明确的限制;

2. Cookie是通过键值对方式组织数据的,故而也可以使用Cookie存储少量数据;

3. Cookie中具体存储的内容是程序员自定义的部分;

4. Cookie中的数据来自于服务器,服务器会通过HTTP响应的报头部分(Set-Cookie字段)。

即服务器决定浏览器的Cookie要存什么;

5. Cookie可以认为是存在于浏览器中的,本质上是存在于硬盘上

Cookie在存储的时候,是按照浏览器+域名 的维度来进行细分的,即不同的浏览器存各自的Cookie,同一个浏览器不同的域名也对应着不同的Cookie;

Cookie中的内容不只有键值对,还有过期时间,过期则删除,比如一些网站,在第一次登录之后,定期自动记录登录状态,若超过其设定的过期时间,则删除;

6. Cookie最终要回到服务器

同一时刻存在很多客户端,客户端会通过Cookie来保存客户使用的中间状态,当客户端访问浏览器时,就会自动把Cookie内容带入到请求中,服务器就可以获取到当前客户端的状态了;

2.5 请求正文body

正文中的内容格式和header中的Content-Type密切相关,常见的正文类型有:

(1)application/x-www.form-urencoded:类似于query string的键值对组织方式;

(2)multipart/form-data;

(3)application/json:最为常见的数据格式;

3. HTTP响应

响应也是由四个部分构成的:

3.1 响应首行

响应首行:版本号+状态码+状态码描述

HTTP状态码描述了这次响应的结果(比如成功、失败,以及失败原因等);

1. HTTP状态码有:

(来源:搜狗百科)

2. 常见HTTP状态码有:

(1)200 OK, 表示访问成功

(2)404 Not Found, 表示访问的资源不存在,在服务器上查询无果

如访问:

页面显示:

也可在fiddler中查看:

(3)403 Forbidden:无访问权限,访问被拒绝

(4)302 Move temporarily:重定向

重定向类似于呼叫转移,在登录页面302非常常见,用于实现登陆成功后自动跳转到主页;

302这样的响应报文中会在header中带有一个Location属性,通过这个属性来描述要跳转到哪个新的地址;

注:注意区别重定向与请求转发:

① 请求转发是servlet/spring里提供的机制;重定向是HTTP里提供的机制;

② 请求转发只能在该服务器内部的资源之间转发,重定向可以重定向到外部资源,即可跳转到别的网站;

③ 请求转发只有一次交互,更高效;重定向需要进行两次交互;

(5)500系列:服务器内部错误

如:504 gateway timeout:请求超时等等;

注:gateway即网关,是一个网络的出入口,通常也用来指代一个机房的入口服务器,192.168.1.1这种ip一般是网关ip;

可总结如下:

类别原因短语
1XXInformational(信息性状态码)接受的请求正常处理
2XXSuccess(成功状态码请求正常处理完毕
3XXRedirection(重定向状态码需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码服务器无法处理请求
5XXServer Error(服务器错误状态码服务器处理请求出错

注:HTTP状态码是RFC标准明确规定的,不允许自定义;

3.2 报头header

HTTP响应的报头也是键值对格式

3.3 空行

与HTTP请求相同,空行是header的结束标记;

3.4 正文body

HTML的页面内容;

HTTP请求与响应总结如下:

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

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

相关文章

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1:什么叫作用域 一:全局作用域 1:全局变量的声明 2:变量声明和使用的顺序 3:方法声明和使用的顺序 前言 1:什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…

练[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei 文章目录 [ZJCTF 2019]NiZhuanSiWei掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识 ​ data伪协议和php伪协议的使用,反序列化,代码审计,文件包含,file_get_contents函数绕过 解题思路 打开题目链接&…

【计算机操作系统慕课版】第二章:进程的控制与描述

注:博主斥巨资买到了2021版本慕课版的pdf 如果需要的话可以来私聊我哦~ 操作系统第二章知识点目录: 一、前言:前驱图与程序执行 1.1前驱图(看箭头就行,名字高级,底层简单) 1.2程序顺序执行 1…

Umijs介绍

今天我们来看 umijs 我们访问官网 https://umijs.org/ 这是一个可 插拔的企业级 React框架 当然 你也可以选择 React 的一个脚手架 但是 这样就有很多需要考虑的东西 用这个umi 很多点 我们就不需要考虑了 框架已经帮我们配置好了 这边 我们点击快速上手的一个 指南 我们可…

vue-img-cutter 实现图片裁剪[vue 组件库]

借助 vue-img-cutter 可以在网页端实现图片裁剪功能,最终功能效果如下: 组件 npm 安装 npm install vue-img-cutter2 --save-dev # for vue2 npm install vue-img-cutter3 --save-dev # for vue3vue-img-cutter使用 template模板标签模块&#xff0c…

用Python操作MySQL教程!干货满满!

python操作数据库介绍 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL S…

Spring基础以及核心概念(IoC和DIQ)

1.Spring是什么 Spring是包含了众多工具方法的IoC容器 2.loC(Inversion of Control )是什么 IoC:控制反转,Spring是一个控制反转容器(控制反转对象的生命周期) Spring是一个loC容器,我们之前学过的List/Map就是数据存储的容器,to…

大数据Doris(五):开始编译 Doris

文章目录 开始编译 Doris 一、下载Doris的安装包 二、解压缩 三、上传配置文件

linux常见命令以及jdk,tomcat环境搭建

目录 Is pwd cd touch cat echo vim 复制粘贴 mkdir rm cp jdk部署 1. yum list | grep jdk进行查找​编辑 2.安装​编辑 3.再次确认 4.判断是否安装成功 tomcat安装 1.下载压缩包,把压缩包上传至linux(可能需要yum install lrzsz) 2.解压缩unzip 压缩包名&…

❓“想创作音乐,但不会编曲?”FL Studio 21 轻松帮你编曲

❓“想创作音乐,但不会编曲?” ❓“不知道如何将各种音乐元素组合起来?” 5个步骤,轻松编曲! 想要成为音乐创作高手,编曲是必不可少的技能。今天为大家带来5个编曲的步骤,让你轻松掌握编曲技巧…

[论文工具] LaTeX论文撰写常见用法及实战技巧归纳(持续更新)

祝大家中秋国庆双节快乐! 回过头来,我们在编程过程中,经常会遇到各种各样的问题。然而,很多问题都无法解决,网上夹杂着各种冗余的回答,也缺乏系统的实战技巧归纳。为更好地从事科学研究和编程学习&#xff…

GEE错误——Line 2: ee.Image(...).filterBounds is not a function

错误: 我正在尝试通过应用过滤器绑定和过滤器日期来提取多个区域的平均碳含量。我得到的错误是:filterbound 不是一个函数。 我认为问题在于我使用的是 ee.Image 而不是 ee.ImageCollection。我知道如何解决这个问题吗?谢谢 这里的代码&am…

字符串和内存函数

目录 strlen 模拟实现 长度不受限字符串函数 strcpy 模拟实现 ​编辑 strcat 模拟实现 strcmp 模拟实现 长度受限字符串函数 strncpy 模拟实现 strncat strncmp strstr 模拟实现 strtok strerror perror 字符分类函数 字符转换 示例: ​编辑内…

10.4 认识Capstone反汇编引擎

Capstone 是一款开源的反汇编框架,目前该引擎支持的CPU架构包括x86、x64、ARM、MIPS、POWERPC、SPARC等,Capstone 的特点是快速、轻量级、易于使用,它可以良好地处理各种类型的指令,支持将指令转换成AT&T汇编语法或Intel汇编语…

C++:模板进阶与继承

模板进阶与继承 模板进阶1.非类型的模板参数2.模板的特化2.1特化的概念2.2函数模板特化2.3类模板特化2.4全特化和偏特化2.4.1全特化2.4.2偏特化 3.模板的分离编译3.1同文件分离3.2不同文件下分离 继承1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和…

哈希应用之位图

文章目录 1.位图概念2.面试题引入3.代码解决[配注释]4.位图应用4.1找到100亿个整数里只出现一次的整数4.2找两个分别有100亿个整数的文件的交集[只有1G内存]1.法一[使用于数据量<42亿]2.法二[适用于数据量大>42亿]3.在一个有100亿个int的文件中找到出现次数不超过2次的所…

自动驾驶技术的基础知识

自动驾驶技术是现代汽车工业中的一项革命性发展&#xff0c;它正在改变着我们对交通和出行的理解。本文将介绍自动驾驶技术的基础知识&#xff0c;包括其概念、历史发展、分类以及关键技术要素。 1. 自动驾驶概念 自动驾驶是一种先进的交通技术&#xff0c;它允许汽车在没有人…

字符集、编码格式的理解

计算机中只能存储二进制01&#xff0c; 要想存储字符&#xff0c;就要有一个字符与编码的映射关系&#xff0c;这个关系就是字符集。 字符集就是字符与编码的映射关系* 字符集的发展历程&#xff1a; 因为计算机是欧美先发明的&#xff0c;他们的语言就26个字母&#xff0c;所…

MyBatis-plus使用

1 基础介绍 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 它已经封装好了一些crud方法&#xff0c;我们不需要再写…

速学数据结构 | 手把手教你会单链表的构建方式

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1. 什么是链表1.1 链表的物理结构1.2 链表的种类 2. 链表的实现一. SList.h 单链表的声明3.…