JavaEE之HTTP协议(1)_HTTP基础知识,HTTP 请求、响应格式,方法,状态码

一、HTTP协议

1.1 基本概念:

HTTP全称超文本传输协议,是一种无状态的、应用层的协议,它基于请求/响应模型。客户端(通常是Web浏览器)通过发送HTTP请求到服务器来获取或发送信息,服务器则返回HTTP响应作为回应。HTTP协议定义了客户端和服务器之间交换消息的格式和过程,使得数据能够在网络上以统一的方式传输。

1.2 HTTP工作原理

 HTTP工作在TCP/IP协议栈的应用层,通常使用80端口进行通信。一个完整的HTTP交互流程包括以下几个步骤:

  1. 建立TCP 连接:客户端与服务器建立一个TCP连接,这是数据传输的前提;
  2. 发送HTTP请求:客户端向服务器发送一个HTTP请求,(如GET /index.html)、请求头部和请求体;
  3. 服务器处理请求:服务器解析器跪求并定位请求资源,如果需要i的话,服务器会执行相应的业务逻辑;
  4. 返回HTTP相应:服务器将响应数据封装成HTTP响应,包括响应状态行(如200 OK)、响应头部和响应体,然后发送回客户端。
  5. 关闭 TCP 连接:通信结束后,TCP连接可以被关闭,或者在持续连接(Keep-Alive)的情况下保持打开状态以供后续请求复用。

二、 数据报文结构

在这里插入图片描述
 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节.

2.1 HTTP 请求格式

在这里插入图片描述

POST https://beacons.gvt2.com/domainreliability/upload HTTP/1.1
Host: beacons.gvt2.com
Connection: keep-alive
Content-Length: 638
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9{"entries":[{"failure_data":{"custom_error":"net::ERR_CONNECTION_TIMED_OUT"},"network_changed":false,"protocol":"","request_age_ms":136344,"request_elapsed_ms":21374,"sample_rate":1.0,"server_ip":"[2404:6800:4008:c04::54]:443","status":"tcp.connection.timed_out","url":"https://accounts.google.com/","was_proxied":false},{"failure_data":{"custom_error":"net::ERR_CONNECTION_TIMED_OUT"},"network_changed":false,"protocol":"","request_age_ms":136344,"request_elapsed_ms":21374,"sample_rate":1.0,"server_ip":"59.24.3.174:443","status":"tcp.connection.timed_out","url":"https://accounts.google.com/","was_proxied":false}],"reporter":"chrome"}

2.2 HTTP 响应格式

在这里插入图片描述

HTTP/1.1 200 OK
Report-To: {"endpoints":[{"priority":1,"url":"https://beacons.gcp.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons2.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons3.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://beacons4.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":1,"url":"https://clients2.google.com/domainreliability/upload-nel","weight":1},{"priority":2,"url":"https://beacons5.gvt2.com/domainreliability/upload-nel","weight":1},{"priority":2,"url":"https://beacons5.gvt3.com/domainreliability/upload-nel","weight":1}],"group":"nel","max_age":300}
NEL: {"failure_fraction":1,"include_subdomains":false,"max_age":300,"report_to":"nel","success_fraction":0.25}
Content-Type: application/javascript; charset=utf-8
Date: Wed, 26 Jun 2024 02:45:34 GMT
Server: Domain Reliability Server
Content-Length: 0
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

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

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

HTTP之 URI 和URL

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址, 以下面的这个URL 为例;

http://user:pass@www.example.jp:80/dir/index.htm?boardID=5&ID=24618&page=1#name

一个完整的 URL 主要包括一下几个部分

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符;

  2. 域名部分:该URL的域名部分为“user:pass@www.example.jp”。一个URL中,也可以使用IP地址作为域名使用;

  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口;

  4. 拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”;

  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名;

  6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URI,全称是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
 Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的URI一般由三部组成:

  1. 访问资源的命名机制
  2. 存放资源的主机名
  3. 资源自身的名称,由路径表示,着重强调于资源。

三、HTTP方法

HTTP定义了多种请求方法,常用的有:

  • GET: 用于请求指定资源。
  • POST: 用于提交数据到指定资源。
  • PUT: 用于更新指定资源。
  • DELETE: 用于删除指定资源。
  • HEAD: 类似于GET,但只返回响应头(获取报文首部)。
  • OPTIONS: 用于描述目标资源的通信选项(询问支持的方法)。
  • CONNECT: 用于建立网络隧道。
  • Link:建立和资源之间的联系.
  • TRACE: 用于回显服务器收到的请求(追踪路径)。

3.1 GET方法

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

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

关于 GET 请求的 URL 长度问题:

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

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 的区别

  1. 语义不同: GET 一般用于获取数据,POST 一般用于提交数据;
  2. GET 的 body 一般为空,需要传递的数据通过 query string 传递,POST 的 query string 一般为空,需要传递的数据通过 body 传递;
  3. GET 请求一般是幂等的,POST 请求一般是不幂等的。(如果多次请求得到的结果一样, 就视为请求是幂等的).
  4. GET可以被缓存,POST不能被缓存.(这一点也是承接幂等性)

四、HTTP 状态码 (重点)

HTTP响应状态码分为五大类:
*** 1xx (信息性响应): 表示接收的请求正在处理。

  • 2xx (成功响应): 表示请求正常处理完毕。
  • 3xx (重定向消息): 表示需要进行附加操作以完成请求。
  • 4xx (客户端错误): 表示客户端请求出错。
  • 5xx (服务器错误): 表示服务器处理请求出错。**

总结

 以上就是今天要讲的内容,本文介绍了HTTP协议的基础知识,包括其无状态、应用层协议的特性,基于请求/响应的工作模式,以及TCP连接、HTTP请求和响应的流程。HTTP方法如GET、POST、PUT等用于不同操作,状态码则表示请求结果。

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

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

相关文章

shell (三)shell脚本

SHELL脚本 编程语言的分类 解释型语言:shell,Python,需要解析器 编译型语言:C语言,C,需要编译器 shell脚本 操作系统的结构 shell(贝壳) 应用层 app,代码 应用层需要通…

1、线性回归模型

1、主要解决问题类型 1.1 预测分析(Prediction) 线性回归可以用来预测一个变量(通常称为因变量或响应变量)的值,基于一个或多个输入变量(自变量或预测变量)。例如,根据房屋的面积、位置等因素预测房价。 1.2 异常检测(Outlier Detection) 线性回归可以帮助识别数…

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】

设置系统时间 本模块用来设置、获取当前系统时间,设置、获取当前系统日期和设置、获取当前系统时区。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import systemTime …

沙盒在数据防泄密领域意义

在信息化快速发展的今天,数据已成为企业最宝贵的资产之一。然而,数据泄密事件频发,给企业的安全和发展带来了巨大威胁。SDC沙盒防泄密系统,作为一种创新的数据防泄密解决方案,正逐渐在数据防泄密领域发挥着越来越重要的…

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法

目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server,Web前端,agent时出现: [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…

Python3极简教程(一小时学完)上

开始 Python 之旅 本教程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 _The Python Standard Library_,并对原教程的内容进行了改进与补充。 相关链接地址如下: _Python tutorial_:Python 入门指南…

数字孪生流域:定义、组成等

数字孪生流域:定义、组成等 1 数字孪生流域(Digital Twin Basin/Watershed)总则1.1 定义1.2 适用范围1.3 建设目标1.4 建设原则 2 数字孪生流域框架与组成2.1 数字孪生流域框架2.2 数字孪生流域组成2.2.1 数字孪生平台2.2.2 信息化基础设施 3…

JavaScript学习笔记(二)

12、数字 常规用法和java的用法相似,就不再做详细的记录, JavaScript 数字 以下只记录特殊用法: 12.1 数字字符串运算 在所有数字运算中,JavaScript 会尝试将字符串转换为数字: var x "100"; var y "10"…

第 5 章理解 ScrollView 并构建 Carousel UI

通过上一章的学习,我相信你现在应该明白如何使用堆栈构建复杂的 UI。当然,在你掌握 SwiftUI 之前,你还需要大量的练习。因此,在深入研究 ScrollView 以使视图可滚动之前,让我们先以一个挑战开始本章。你的任务是创建一个类似于图 1 所示的卡片视图。 …

swp添加池子addLiquidity失败

案发现场 首次添加交易对、一直失败、但是也没提示具体的原因。到这一步就没了、由下图可知、也没看到log、由此可见第一步就失败了。 解决方案 一、添加 工厂KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

注意!短视频的致命误区,云微客教你避开!

为什么你做短视频就是干不过同行?因为你总想着拍剧情、段子这些娱乐视频,还想着当网红做IP人设,但是这些内容跟你的盈利没有半毛钱关系,况且难度大、见效慢,还不是精准客户。 以上这些就代表你走进了短视频的误区&…

C++初学者指南-2.输入和输出---流输入和输出

C初学者指南-2.输入和输出—流输入和输出 文章目录 C初学者指南-2.输入和输出---流输入和输出1.定制输入/输出1.1 示例:点坐标输入/输出1.2 流操作符1.3(一部分)标准库流类型 2. 工具2.1 用getline读取行 2.2 用ignore进行跳转2.3 格式化操作…

【论文阅读】-- Temporal Summary Images:通过交互式注释生成和放置实现叙事可视化的方法

Temporal Summary Images: An Approach to Narrative Visualization via Interactive Annotation Generation and Placement 摘要1 引言2 背景及相关工作2.1 叙事可视化和讲故事2.2 显示面向时间的数据2.3 小倍数和漫画2.4 注释可视化 3 设计要求和工作流程3.1 工作流程3.2 TSI…

基线核查--渗透

基线检查 基线核查概念 it中定义: 基线为初始的标准,以后更改就要经过授权,形成下一基线。 软件配置管理的基线:1功能基线,分配基线,产品基线 安全配置基线--基线核查 安全基线可以说是木桶理论&…

【python】eval函数

1.eval函数的语法及用法 (1)语法:eval(expression) 参数说明: expression:必须为字符串表达式,可为算法,也可为input函数等。 说明:表达式必需是字符串,否则会报错&a…

Vue3-尚硅谷笔记

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

Dubbo运行原理

目录 Dubbo通讯协议 Dubbo负载均衡策略 RPC和HTTP有什么区别? 让你设计一个RPC框架,如何考虑数据序列化问题? Dubbo 是一款高性能、轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务…

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介绍说明 1.1 说明 1.1.1 消费者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服务满足: 1 openfegin 配置fallback逻辑,作为统一fallback服务降级处理。 2.sentinel访问触发了自定义的限流配置,在注解sentinelResource里面配置…

基于SpringBoot的学生综合测评系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架 工具:MyEclipse、Tomcat 系统展示 首页 系统首页,提供综合…

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件,汇聚了创意与技术的精华。作为Adobe推出的全新版本,它以其强大的视频处理和动画创作能力,成为从事设计和视频特技的机构,如电视台、动画制作公司、个人后期制作工作室以及多媒体工…