什么是HTTP协议?HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种通信规则,它定义了客户端(如浏览器、手机APP) 和服务器 之间如何交换信息,是用于在万维网(WWW)中传输数据的应用层协议,它定义了客户端与服务器之间如何通信、如何请求资源如网页、图片、视频,以及如何响应请求,是互联网信息交互的通用语言。

 一、HTTP协议的核心定位:应用层的通信规则在TCP/IP协议栈(互联网的基础通信框架)中,HTTP属于应用层协议,其底层依赖传输层的TCP协议提供可靠的数据传输通道。TCP负责把数据安全送到对方,确保数据不丢失、不混乱,HTTP负责定义数据的格式和交互逻辑。 

二、 HTTP的核心特点 :1. 无状态HTTP协议本身不记录“前后请求的关联”——服务器不会记住上一次给这个客户端发了什么,每次请求都是独立的、全新的。 例如:你第一次访问某购物网站,服务器不知道你是谁;第二次点击“加入购物车”,若没有Cookie或Token(用于身份标识的技术),服务器依然不认识你。 2. 请求-响应模式(Request-Response)通信必须由客户端主动发起,服务器只能“被动响应”,不会主动向客户端发送数据。流程固定为: 客户端发送请求 → 服务器处理请求 → 服务器返回响应3. 可扩展HTTP允许通过头部字段扩展功能,比如用Accept-Encoding: gzip告诉服务器我支持压缩数据。 4. 媒体无关HTTP可传输任意类型的数据(只要客户端和服务器约定好格式,包括网页、图片、视频、JSON数据等。

三、HTTP的核心交互流程:请求与响应 一次完整的HTTP通信,本质是客户端发请求、服务器回响应的过程,两者都有固定的格式。

1. HTTP 请求(客户端→服务器)
请求由 3 部分组成:请求行、请求头部、请求体(可选)。

请求头部:辅助信息,如Host(指定服务器域名)、Cookie(携带客户端的身份信息,如登录状态)、Content-Type(POST 请求时,说明请求体的数据格式,如application/json)。
请求体:仅 POST/PUT 等请求有,用于传递数据(如登录时的 “用户名 + 密码”、上传的文件内容)。请求行:核心信息,决定 “要做什么”。请求方法:常用有GET(获取资源,如打开网页)、POST(提交数据,如登录、上传表单)、PUT(修改资源)、DELETE(删除资源)。

程序如何接收前端网页的数据?第一种方式:通过GET、POST等请求。

这种方式首先就要在方法上加上注解@RequestMapping并给定路径("v1/car/add")而要给客户端反馈还得加上@ResponseBody注解。同时用户在输入网址的时候要按照以下格式:localhost:+(本地的port)+路径+?+给定参数赋值

@Controller
public class CarController {@RequestMapping("v1/car/add")@ResponseBodypublic String add(String brand,String color,int price){System.out.println("品牌是:"+brand+"颜色是"+color+"价格是"+price);return "add";}
}

localhost:8080/v1/car/add?brand=tsl&color=black&price=100000

这种方式属于后端,需要注意一定要先启动程序,然后再输入网址,顺序不能反,如果有修改代码,也一定要重新运行程序。

第二种方式:通过.html文件获取。

所有的.html文件都属于静态资源,所以应该在resources中的static里面创建。完成创建后里面会有个<body>的标签,在<body>内即可编辑页面。比如想拿到车辆的brand、color、price等信息并添加,先设置好路径并告诉它方法是post(post就是添加的作用)然后用<input>标签就可以让用户输入,并给placeholder提示。在打开网页的时候一定要确保后端的代码仍然处于运行状态。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="http://localhost:8080/v1/car/add" method="post"><input type="text" name="brand" placeholder="请输入品牌"><input type="text" name="color" placeholder="请输入颜色"><input type="text" name="price" placeholder="请输入价格"><input type="submit" value="添加车辆">
</form>
</body>
</html>

这就通过用.html完成了新增车辆的功能,但这属于前端的处理方式,不再做过多的讨论。

这里只有三个参数需要给,但实际中可能会有很多参数,而一旦只要有一个字母打错了就可能导致整个程序没法收到客户端的请求。那么就可以将客户端提供的数据先保存到一个AddCarDTO类中并定义必要的参数,加上tostring/get/set方法,这个DTO类可以放到一个pojo包里面,那么程序就会根据这个类来得到客户端输入的数据。

    @RequestMapping("/v1/car/add2")@ResponseBodypublic String add2(AddCarDTO addCarDTO){System.out.println(addCarDTO);return "add";}

localhost:8080/v1/car/add2

localhost:8080/v1/car/add2?brand=byd&color=white&price=300000

可以看到,分别给了没值和有值的,就算不输入必要的信息,它也会给默认值而不会获取失败,这样既能方便用户输入,也减少了输入错误的可能。

接下来在当前工程实现一个功能:BMI身体质量指数测试 BMIController。客户端将用户的 身高height和 体重weight 传递给服务端,服务端接收参数并计算用户的身体健康指数。计算公式:bmi = 体重kg/(身高m*身高)<18.5 偏瘦 <24 正常 <27 微胖 >=27 该减肥了

先在pojo里面创建一个BmiDTO类,接收网页数据时就是用这个类,同时加上get/set/tostring方法。然后在Controller中创建BMIController类,用于计算bmi,属于后端的业务。根据接收的BmiDTO类的对象,获取其中的高度和重量,完成计算后根据bmi所在的范围给客户端反馈。

public class BmiDTO {private double weight;private double height;@Overridepublic String toString() {return "BmiDTO{" +"weight=" + weight +", height=" + height +'}';}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}
}
@Controller
public class BMIController {@RequestMapping("/v1/bmi/func")@ResponseBodypublic String func(BmiDTO bmi){double high=bmi.getHeight();double weight=bmi.getWeight();double res=weight/(high*high);if(res<18.5)return "偏瘦";else if(res<24)return "正常";else if(res<27)return "微胖";elsereturn "该减肥了";}
}

2. HTTP 响应(服务器→客户端)
响应同样由 3 部分组成:状态行、响应头部、响应体(可选)。
状态行:核心是状态码,用数字表示请求的处理结果(常见状态码如下表)。
响应头部:辅助信息,如Content-Type(标识响应体的类型)、Set-Cookie(服务器向客户端写入 Cookie,如登录后的身份令牌)、Cache-Control(控制资源的缓存策略,如 “缓存 1 小时”)。
响应体:服务器返回的实际数据,如 HTML 网页、JSON 数据、图片二进制流等(若状态码是 404,响应体可能是 “404 页面找不到” 的提示内容)。

常见 HTTP 状态码分类
状态码以 “第一位数字” 区分含义,核心常用码如下:

        1xx(信息性):临时响应,告知客户端 “请求已收到,正在处理”(极少用,如100 Continue)。
        2xx(成功):请求已正常处理,最常用:
        200 OK:通用成功(如网页加载、API 调用成功);
        201 Created:资源创建成功(如 POST 请求新增用户、上传文件成功)。
        3xx(重定向):请求需要进一步操作(客户端需跳转):
        301 Moved Permanently:永久重定向(如旧域名跳转新域名,搜索引擎会更新地址);
        302 Found:临时重定向(如登录后跳转首页,下次访问仍走原地址);
        304 Not Modified:缓存命中(客户端本地有最新缓存,无需重新下载资源)。
        4xx(客户端错误):请求本身有问题,服务器无法处理:
        400 Bad Request:请求参数错误(如 JSON 格式错误、必填字段缺失);
        401 Unauthorized:未授权(需要登录或令牌失效);
        403 Forbidden:权限不足(已登录,但无操作权限,如普通用户删管理员数据);
        404 Not Found:资源不存在(如访问不存在的网页、API 路径错误)。
        5xx(服务器错误):服务器处理请求时出错(客户端无错):
        500 Internal Server Error:通用服务器错误(如代码 bug、数据库连接失败);
        502 Bad Gateway:网关错误(服务器作为网关时,上游服务器无响应,如反向代理后端挂了);
        503 Service Unavailable:服务暂时不可用(如服务器维护、负载过高);
        504 Gateway Timeout:网关超时(上游服务器响应太慢,网关等不及)。

在浏览器中输入www.360buy.com打开的却是京东页面

背后核心是域名重定向机制,对应的 HTTP 状态码主要是 3xx 系列重定向状态码,最常见的是 301 永久重定向 或 302 临时重定向,其中京东对该域名的配置更可能是 301 永久重定向。
为什么会跳转?—— 域名历史与重定向逻辑
360buy.com 本身是京东早期使用的域名(京东曾用名 “360buy 京东”),后来为了品牌统一,将主域名切换为 jd.com。为了避免老用户因记忆旧域名无法访问,京东会通过服务器配置,让所有访问 www.360buy.com 的请求自动跳转到 www.jd.com(或京东主站其他地址),这个过程就是 “HTTP 重定向”。
核心状态码:301 和 302 的区别
重定向的核心是通过 HTTP 响应头中的 Location 字段指定新地址,同时用 3xx 状态码 告诉浏览器 “该地址已变更,请访问新地址”。其中京东对 360buy.com 的配置更可能是 301 永久重定向

四、HTTP与HTTPS的核心区别

我们常说的 “HTTP 不安全”,本质是它传输数据时不加密,数据在网络中可能被拦截、篡改(如 “中间人攻击”)。而 HTTPS(HTTP Secure)是 “HTTP+SSL/TLS 加密协议” 的组合,解决了安全问题:

HTTP 协议(HyperText Transfer Protocol,超文本传输协议)和 HTTPS 协议(HyperText Transfer Protocol Secure,超文本传输安全协议)是互联网中用于客户端(如浏览器)与服务器之间数据传输的核心协议,二者的核心区别在于安全性,但在传输原理、端口、应用场景等维度也存在显著差异。以下从 7 个关键维度进行详细对比,并补充核心原理说明:

1.安全性:明文 vs 加密(核心区别)
HTTP 的安全隐患:HTTP 传输的数据是 “明文”—— 比如在网页上输入的账号密码、支付信息,会以 “原始文本” 的形式在网络中传输。如果数据被 “中间人”(如黑客通过公共 WiFi 拦截、路由器劫持)捕获,可直接读取内容,甚至篡改数据,完全无安全保障。
HTTPS 的安全机制:HTTPS 通过SSL/TLS 协议解决了 HTTP 的安全问题,核心依赖两种加密技术和证书验证,混合加密(对称加密 + 非对称加密),通过 TLS/SSL 协议对 HTTP 协议的传输过程进行加密和认证,从而解决 HTTP 协议原生存在的明文传输、身份不可信、数据易篡改三大安全问题。
服务器需安装权威 CA 机构颁发的证书,证书中包含服务器的公钥和身份信息。客户端(浏览器)会验证证书的合法性 —— 若证书无效,浏览器会弹出 “不安全” 警告,避免用户连接到伪装的钓鱼网站。

2. 传输流程:简单 vs 多握手步骤
HTTP 传输流程:客户端通过 TCP 协议与服务器的 80 端口建立连接;客户端发送 HTTP 请求;服务器返回 HTTP 响应;连接关闭(或保持长连接)。整个过程无额外安全步骤,流程简单。
HTTPS 传输流程:在 HTTP 流程基础上,增加了SSL/TLS 握手阶段(约 3-4 次 TCP 交互):客户端与服务器的 443 端口建立 TCP 连接;SSL/TLS 握手:客户端发送 “支持的加密算法列表”“随机数 A”;服务器返回 “选定的加密算法”“随机数 B”“服务器 SSL 证书”;客户端验证证书合法性,生成 “预主密钥”,用服务器公钥加密后发送给服务器;客户端和服务器分别用 “随机数 A + 随机数 B + 预主密钥” 生成相同的 “对称加密密钥”;后续的 HTTP 请求 / 响应,均用 “对称加密密钥” 加密后传输;连接关闭(或保持长连接)。握手阶段是 HTTPS 比 HTTP 慢的主要原因,但现代浏览器和服务器会通过会话复用等技术减少重复握手,降低性能损耗。

在网络通信中优先使用https,它从根本上解决了 HTTP 协议的安全缺陷,能保护数据传输的完整性、机密性和身份真实性,同时满足现代网络环境对安全、合规和用户信任的核心需求。

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

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

相关文章

江协科技STM32学习笔记补充之003 :STM32复位电路的详细分析

电路作用与每个器件R1&#xff08;10 kΩ&#xff0c;上拉到 3V3&#xff09;让 NRST 在无外力时保持高电平&#xff1d;不复位&#xff1b;同时与电容形成 RC&#xff0c;决定上电复位延时。阻值不能太小&#xff08;否则调试器或芯片复位驱动下拉电流太大&#xff09;&#x…

Spring Boot HTTP状态码详解

Spring Boot HTTP状态码完全指南&#xff1a;从入门到精通 前言 在RESTful API开发中&#xff0c;HTTP状态码是与客户端通信的重要桥梁。Spring Boot通过HttpStatus枚举提供了完整的HTTP状态码支持。本文将深入解析这些状态码的含义、使用场景以及在Spring Boot中的最佳实践。 …

怎样让外网计算机访问局域网计算机?通过公网地址访问不同内网服务的设置方法

局域网服务器提供公网访问&#xff0c;或指定某些端口应用资源给外地访问&#xff0c;都是常见跨网通信需求。在一些场景下&#xff0c;内部网络中的服务器需要通过公网地址进行访问&#xff0c;尤其是在没有固定公网IP或需要在外部访问时。为了解决这一问题&#xff0c;可以使…

Spring Boot启动失败从循环依赖到懒加载配置的深度排查指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

从零开始学大模型之大语言模型

大语言模型 4.1 什么是 LLM 在前三章&#xff0c;我们从 NLP 的定义与主要任务出发&#xff0c;介绍了引发 NLP 领域重大变革的核心思想——注意力机制与 Transformer 架构。随着 Transformer 架构的横空出世&#xff0c;NLP 领域逐步进入预训练-微调范式&#xff0c;以 Tran…

如何将视频从 iPhone 转移到 Mac

将视频从 iPhone 转移到 Mac 是许多用户常见的需求。无论你是想备份重要的视频&#xff0c;还是希望在更大的屏幕上观看&#xff0c;以下方法都能帮助你轻松完成。方法一&#xff1a;使用 iReaShare iPhone ManageriReaShare iPhone Manager 是一款功能强大的工具&#xff0c;可…

五、Docker 核心技术:容器数据持久化之数据卷

Docker 容器本身是无状态且生命周期短暂的。当一个容器被删除时&#xff0c;它在可写层产生的所有数据都会随之消失。这对于需要持久化存储数据的应用 (如数据库、日志系统、用户上传内容) 来说是不可接受的。为了解决这个问题&#xff0c;Docker 提供了多种数据持久化方案&…

前端视觉交互设计全解析:从悬停高亮到多维交互体系(含代码 + 图表)

在前端用户体验领域&#xff0c;视觉交互是连接用户与产品的 “隐形桥梁”—— 它通过可视化信号传递操作意图、反馈系统状态&#xff0c;直接决定用户对产品的感知。很多开发者对视觉交互的认知停留在 “鼠标悬停高亮”&#xff0c;但实际上&#xff0c;视觉交互是一个覆盖 “…

从零打造商业级LLMOps平台:开源项目LMForge详解,助力多模型AI Agent开发!

最近&#xff0c;我发现了一个超级实用的开源项目——LMForge-End-to-End-LLMOps-Platform-for-Multi-Model-Agents&#xff08;以下简称LMForge&#xff09;。这个项目是一个端到端的LLMOps&#xff08;Large Language Model Operations&#xff09;平台&#xff0c;专为多模型…

【C++练习】06.输出100以内的所有素数

目录输出100以内的所有素数方法1&#xff1a;基础判断法方法2&#xff1a;埃拉托斯特尼筛法&#xff08;效率更高&#xff09;方法3&#xff1a;优化版筛法&#xff08;只考虑奇数&#xff09;方法4&#xff1a;使用STL算法方法5&#xff1a;递归实现总结&#xff1a; 输出100以…

在开发中使用git rebase的场景

rebase介绍 一、背景 远程仓库有oh4w-dev和oh4k-dev两个分支&#xff0c;oh4k-dev是基于oh4w-dev开发到80%的代码新拉的分支&#xff1b;此后两条分支同步开发&#xff0c;当oh4k-dev开发完成&#xff0c;oh4w-dev还在开发阶段&#xff0c;oh4k-dev需要拉取到oh4w-dev自分出o…

TDengine 时序函数 NOW() 用户手册

TDengine NOW() 函数用户使用手册 目录 功能概述函数语法返回值说明技术特性使用场景及示例时间运算操作注意事项常见问题 功能概述 NOW() 函数是 TDengine 中的时间函数&#xff0c;用于获取客户端当前系统时间。该函数在时序数据库中特别有用&#xff0c;可以用于数据插入…

JavaWeb ——事务管理

文章目录事务管理事务回顾Spring事务管理事务进阶事务属性 - 回滚 rollbackFor事务属性 - 传播行为 propagationSpring框架第一大核心: IOC控制反转&#xff0c; 其第二大核心就是 AOP 面向切面编程 事务管理 事务回顾 Spring事务管理 # spring 事务管理日志 logging:level:org…

【跨国数仓迁移最佳实践8】MaxCompute Streaming Insert: 大数据数据流写业务迁移的实践与突破

本系列文章将围绕东南亚头部科技集团的真实迁移历程展开&#xff0c;逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第八篇&#xff0c;MaxCompute Streaming Insert&#xff1a; 大数据数据流写业务迁移的实践与突破。注&#xff1a;客户背景为东南…

2025-09-05 CSS4——浮动与定位

文章目录1 显示&#xff08;Display&#xff09;1.1 visibility:hidden1.2 display:none2 块和内联元素2.1 块元素2.2 内联元素2.3 改变元素的显示方式3 浮动&#xff08;Float&#xff09;3.1 float 属性3.2 clear 属性4 定位&#xff08;Position&#xff09;4.1 五种定位模式…

43这周打卡——生成手势图像 (可控制生成)

目录 前言 1.导入数据及数据可视化 2.构建模型 3.训练模型 4.模型分析并生成指定图像 总结 前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.导入数据及数据可视化 from torchvision import data…

TDengine 时间函数 TIMEDIFF() 用户手册

TDengine TIMEDIFF() 函数详细使用手册 目录 功能概述函数语法参数说明返回值说明版本变更说明技术特性使用场景及示例时间单位处理数据类型兼容性注意事项常见问题最佳实践 功能概述 TIMEDIFF() 函数用于计算两个时间戳的差值&#xff0c;返回 expr1 - expr2 的结果。结果…

【2025ICCV-持续学习方向】一种用于提示持续学习(Prompt-based Continual Learning, PCL)的新方法

1. 背景与问题 (Background & Problem):​​ ​持续学习 (CL):​​ 目标是在不遗忘旧任务知识的情况下,让模型持续学习一系列新任务。主要挑战是灾难性遗忘。 ​基于提示的持续学习 (PCL):​​ 利用预训练视觉Transformer (ViT),冻结其权重,通过微调称为“提示”(prompt…

2025 年 08 月 GitHub 十大热门项目排行榜

欢迎来到 2025 年 8 月 GitHub 热门开源项目排行榜&#xff01;本月榜单集中展示了来自智能体平台、AI 编程助手、多模态角色系统、本地化部署工具到可视化白板与企业协同平台的多元创新。从构建 AI 助手中枢的 Archon&#xff0c;到终端 AI 编码拍档 Crush&#xff0c;再到虚拟…

LeetCode每日一题,2025-9-4

多数元素 投票法 让你找到序列中出现超过二分之一的元素&#xff0c;一定要记住这个规则。 记录两个值val和cnt&#xff0c;刚开始val为任意数&#xff0c;cnt0。 如果cnt是0&#xff0c;就把当前val num。接下来判断&#xff0c;ifnum val&#xff0c;则cnt &#xff0c;e…