什么是http协议?get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【什么是http协议?get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些? 】

【修真院JAVA小课堂】 什么是http协议?get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?

大家好,我是IT修真院西安分院第四期的学员赵立鼐,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务二,深度思考中的知识点——什么是http协议?

(1)背景介绍:

  HTTP的诞生

为知识共享而规划Web

1989年3月,互联网还只是属于少数人。在这一互联网的黎明期,HTTP诞生了。 CERN(欧洲核子研究组织)的蒂姆·博纳斯-李(Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。

最初设想的理念是:借助多文档之间相互关联形成的超文本(HyperText),连成可以相互参阅的WWW(World Wide Web,万维网)  现在已经提出了3项WWW构建技术,分别是:把SGML(标准通用标记语言)作为页面的文本标记语言的HTML(HyperText Markup Language,超文本标记语言);作为文档传递协议的HTTP;指定文档所在地址的URL(Uniform Resource Locator,统一资源定位符)。

WWW 这一名称,是Web浏览器当年用来浏览超文本的客户端应用程序时的名称。现在则用来表示这一系列的合集,也可简称为Web.

驻足不前的HTTP

HTTP于1990年问世。那时的HTTP并没有作为正式的标准被建立。现在的HTTP其实含有HTTP1.0之前版本的意思,

因此被称为HTTP/0.9

HTTP正式作为标准被公布是在1996年的5月,版本被命名为HTTP/1.0,并记载于RFC1945。虽说是初期标准,但该协议标准至今仍被广泛使用在服务器端。

HTTP/1.1

1997年1月公布的HTTP/1.1是目前主流的HTTP协议版本。当初的标准是RFC2068,之后发布的修订版RFC2616就是当前最新的版本。

可见,作为web文档传输协议的HTTP,它的版本几乎没有更新。新一代HTTP/2.0正在制定中,但要达到较高的使用覆用率,仍需加以时日。

当年的HTTP协议的出现主要是为了解决文本传输的难题。由于协议本身非常简单,于是在此基础上设想了很多应用方法并投入了实际应用。现在的HTTP协议已经超出了 Web这个框架的局限,被运用到了各种场景里。

(2)知识剖析:

什么是HTTP协议?

HTTP协议用于客户端和服务端之间的通信。 HTTP协议和TCP/IP协议族内的其他众多协议相同,用于客户端和服务端之间的通信。 请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。

肯定是先从客户端开始建立通信的,服务器端在没有接受到请求之前不会发送响应。

请求报文

请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。

响应报文

响应报文基本是由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

HTTP是不保存状态的协议

HTTP是一种不保存状态,既无状态协议。

HTT协议本身不对请求和响应之间的通信状态进行保存。也就是说HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。

使用HTTP协议,每当有新的请求发送过来时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。

告知服务器意图的HTTP方法

GET:获取资源

GET请求用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。

POST:传输实体主体

POST方法用来传输实体的主体

虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。

虽说POST的功能与GET很相似,但POST的主要目的并不是获得响应的主体内容。

HTTP只是行为准则,而TCP才是GET和POST怎么实现的基准。

区别:GET产生一个TCP数据包,POST请求产生两个TCP数据包

  对于GET方式的请求,浏览器会把HTTP Header和data一并发送出去,服务器响应200(返回数据)

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

持久连接节省通信量

HTTP协议的初始版本中,没进行一次HTTP通信就要断开一次TCP连接,以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,文档中包含大量图片的情况多了起来。

比如,使用浏览器浏览一个包含很多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源。因此,每次的请求都会造成无畏的TCP连接建立和断开,增加通信量的开销。

持久连接:

为解决上述TCP连接问题,HTTP/1.1和部分HTTP/1.0想出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特定是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。

持久连接旨在建立一次TCP连接后进行多次请求和响应的交互。

管线化: 持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个的等待响应了。

状态码告知从服务器端返回的请求结果

状态码的职责是当客户端向服务器端发请求时,描述返回的请求结果。借助状态码,用户可以知道服务器是正常处理了请求,还是出现了错误。

状态码如 200 OK,以3位数字和原因短语组成。

数字中的第一位指定了响应类别,后两位无分类。响应类别有以下5种:

1×× Informational(信息性状态码) 接受的请求正在处理

2×× Success (成功状态码) 请求正常处理完毕

3×× Redirection(重定向状态码) 需要进行附加操作以完成请求

4×× Client Error(客户端错误状态码) 服务器无法处理请求

5×× Server Error(服务器错误状态码) 服务器处理请求出错

Content-Type 说明了实体主体内对象的媒体类型。

常见的媒体格式类型如下:

text/html: HTML格式

text/plain:纯文本格式

text/xml: xml格式

image/gif: gif图片格式

image/jpeg: jpg图片格式

image/png:png图片格式

(3)常见问题:

都有哪些常见的HTTP错误码?

(4)解决方案:

4开头的响应结果表明客户端是发生错误的原因所在

400 Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求内容后再次发送请求。

401 Unauthorized

该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过 1次请求,则表示用户认证失败。

403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想做说明的话,可以 在实体部分对原因进行描述,这样就能让用户看到了。

未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因。

404 Not Found

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

5开头的响应结果表明服务器本身发生错误。

500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在BUG或某些临时的故障。

503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

状态码和状况的不一致

不少返回的状态码响应都是错误的,但是用可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回200 OK ,这种情况也经常遇到。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

各种协议与HTTP协议的关系

我们可以通过下面这张图来了解下IP协议、TCP协议和DNS服务在使用HTTP协议的通信过程中各自发挥了那些作用。

(7)参考文献:

书籍: 图解HTTP 

  作者: [日]上野宣

(8)更多讨论:

Q1:鲁伯良: 1、 HTTP的缺点

a、通信使用明文不加密,内容可能被窃听

b、不验证通信方身份,可能遭到伪装

c、无法验证报文完整性,可能被篡改

Q2:刘优:2、 HTTP和HTTP的关系

A2: 赵立鼐 : HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护

Q3:秦永辉: 3、   什么是HTTP协议

A3: 赵立鼐:   HTTP:超文本传输协议。使用的是可靠的数据传输协议,在传输的过程中不会被损坏或产生混乱。HTTP可以从遍布全世界的Web服务器商将各种信息块迅速、便捷、可靠地搬移到人们桌面上的Web浏览器上去。

(9)鸣谢:

感谢刘优师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:,初学者转行到互联网的聚集地

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从来没有最好的K-V系统,只有最适合应用业务实际场景的系统,做任何的方案选择,要结合业务当前的实际情况综合权衡,有所取有所舍。
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取referer,从而PV只能统计到网站的PV。 为了方便统计页面的PV,这里简单的写了一个java程
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 采样率 采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立分布式kv系统替换mongodb的思路
验证用户输入是否正确是我们应用程序中的常见功能。Spring提供了`@Valid`和@`Validated`两个注解来实现验证功能,本文详细介绍 [@Valid]和[@Validated]注解的区别 。
引入pdf2dom <dependency> <groupId>net.sf.cssbox</groupId> <artifactId>pdf2dom</artifactId> <version>1.8</version&
grafana 是一款非常优秀的可视化报表工具,有设计精良的可视化工具,今天来聊一聊如何将grafana集成到自己的应用中。 原理是: grafana允许iframe访问,开启auth.proxy, java 后端鉴权后代理grafana 前端通过iframe访问后端代理过的grafana graf
介绍 Call Graph是一款IDEA插件,用于可视化基于IntelliJ平台的IDE的函数调用图。 这个插件的目标是让代码更容易理解,有助于读懂和调试代码。当前只支持Java。针对Typescript、Javascript或Python工具,可以使用作者的另外一款工具Codemap(https:
原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: /** * mongodb 分布式锁 */ @Data @NoArgsConstructor @AllArgsConstructor @Document(collection = "distributed-loc
Singleton 单例模式 单例模式是确保每个应用程序只存在一个实例的机制。默认情况下,Spring将所有bean创建为单例。 你用@Autowired获取的bean,全局唯一。 @RestController public class LibraryController { @Autowired
pipeline 分布式任务调度器 目标: 基于docker的布式任务调度器, 比quartzs,xxl-job 更强大的分布式任务调度器。 可以将要执行的任务打包为docker镜像,或者选择已有镜像,自定义脚本程序,通过pipeline框架来实现调度。 开源地址: https://github.c
python训练的模型,转换为onnx模型后,用python代码可以方便进行推理,但是java代码如何实现呢? 首先ONNX 推理,可以使用`onnxruntime` ```xml com.microsoft.onnxruntime onnxruntime 1.15.1 ``` 另外,训练的模型需要
要获取内网地址,可以尝试连接到10.255.255.255:1。如果连接成功,获取本地套接字的地址信息就是当前的内网IP。 python实现: ```python import socket def extract_ip(): st = socket.socket(socket.AF_INET, s
为什么要有索引 gremlin 其实是一个逐级过滤的运行机制,比如下面的一个简单的gremlin查询语句: g.V().hasLabel("label").has("prop","value") 运行原理就是: 找出所有的顶点V 然后过滤出
最近在分析一个应用中的某个接口的耗时情况时,发现一个看起来极其普通的对象创建操作,竟然每次需要消耗 8ms 左右时间,分析后发现这个对象可以通过对象池模式进行优化,优化后此步耗时仅有 0.01ms。
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章。 此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。 当前文章属于Java 性能分析优化系列
如何将Java JAR 转化为 win/mac/linux 独立可执行程序?不需要预装 JRE 运行?
点赞再看,动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 Java 19 在2022 年 9 月 20 日正式发布,Java 19 不是一个长期支持版本,直到 2023 年 3 月它将被 JD
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Cla
JSON 对于开发者并不陌生,如今的 WEB 服务、移动应用、甚至物联网大多都是以 **JSON** 作为数据交换的格式。学习 JSON 格式的操作工具对开发者来说是必不可少的。这篇文章将介绍如何使用 **Jackson** 开源工具库对 JSON 进行常见操作。