【Java ee初阶】HTTP(2)

一、HTTP的方法

方法

说明

支持的HTTP协议版本

GET

获取资源

1.0、1.1

POST

传输实体主体

1.0、1.1

PUT

传输文件

1.0、1.1

HEAD

获得报文首部

1.0、1.1

DELETE

删除文件

1.0、1.1

OPTIONS

询问支持的方法

1.1

TRACE

追踪路径

1.1

CONNECT

要求用隧道协议连接代理

1.1

LINK

建立和资源之间的联系

1.0

UNLINE

断开连接关系

1.0

GET:从服务器上获取某个资源

POST:向服务器上传xxx个资源

PUT:向服务器上传xxx资源(文件)

DELETE:删除服务器的xxx资源

其余的方法,使用的非常少,因此我们忽略不计

(1)GET

(一)

HTTP中最常见到的方法,有着很多操作,都会触发HTTP GET请求

1.直接在浏览器地址栏中输入URL,点收藏夹也是一样的

2.在页面上点击一些连接跳转的时候

3.HTML间接加载其他资源的时候(CSS,JS,图片......)

HTML中通过link标签,加载css

通过script标签,加载js

通过img标签,加载图片

3.也可以通过js /java/c++/Python代码手动构造GET请求

(二)GET请求的特点

GET请求一般没有body,如果你通过代码构造一个get请求,故意添加上body,理论上也是可行的

GET请求要想给服务器传递数据,往往就是通过  路径/querys stirng 来进行传递

(2)POST请求

(一)

1.登录的时候

body提交的就是用户名和密码。

用户名密码,得是加密后再传输的,不能直接明文传输

对于GET请求这种没有body的情况,一般不会用来实现登录功能。如果非要去实现也行,可以把用户名密码加密之后,通过query string进行传输

2.上传资源/文件

body部分就是我们传输的图片和内容,图片属于“二进制文件”。通过HTTP body传输的时候,有时候就会把二进制的内容,通过base64进行编码,变成文本的内容

body中完全可以放二进制数据的(压缩的结果)

之所以用Base64转成文本,主要还是因为当前图片本身比较小,按照文本的方式,服务器代码处理起来好实现。

base64:把而仅仅只数据,用文本(ascii字符)进行重新编码,通过4个ascii字符,标识原来的3个字节的二进制数据。

body可以存二进制,但是url的query string不能

如果由二进制的数据想通过query string来进行保存,那么就可以通过base64进行编码

(二)POST请求的特点

带有body,通过body给服务器传递数据

不太需要query stirng传递了,通常情况下没有query string(不绝对)

post的body格式看起来好像是和 query string 差不多(但是这里还有其他情况)

HTTP的这些方法,在使用的时候不一定严格按按照官方提供的语义来进行

经典面试题——谈谈GET和POST的区别

核心结论:GET 和 POST其实没有本质区别,只是HTTP的两个不同的方法。大部分情况下,使用GET的场景,也可以替换成POST,使用POST的场景也可以替换成GET

但是从使用习惯来讲,还是存在差异的

(1)GET通常没有body,通过query stirng传递数据给服务器

POST通常由body,不需要通过query string 传递数据

*并不绝对,你自己写一个代码,构造GET请求,加上body;构造POST请求,加上query stirng 都是可行的

(2)语义上的区别:GET标识“获取”,POST表示“提交”

*不绝对,目前HTTP的方法在时间中经常会混用

GET和 POST 的区别最主要就是上面这两个

网上还有一些其他的说法

*GET请求不安全,POST请求比GET更安全

比如登录场景中,GET的话,就会把用户名和密码显示到URL上,如果别人看一眼你的屏幕,就会知道你的密码❌

安全,得是通过“加密”来完成的

如果这个说法是正确的,那么即使没有人看你的屏幕,黑客一抓包,也就看到了

*幂等性 GET请求 官方建议实现成“幂等的”(也就是当你的请求一定的时候,得到的响应结果也就一定),而POST请求无要求(HTTP标准文档上)❌

标准文档只是“建议”,实际开发的时候,不一定会遵守,尤其是在现在,很多的网站都开始讲究“个性化”

*可缓存,承接幂等

GET如果实现成幂等,就可以把结果缓存起来

POST不是先成幂等,就不能缓存❌

*传输的数据量

之前有一个说法,GET请求传输的数据量少,POST传输的数据两最大,GET请求的URL存在长度限(1MB,10MB,1KB,2KB...)❌

HTTP标准文档中没有对URL的长度给出限制,上面的限制主要来自于 浏览器/HTTP服务器的实现。

*数据的类型

GET传输数据的时候,通过query string只能传输文本,POST通过body传输,也可以传输二进制❌

query string虽然不能够直接传输二进制,但是可以通过Urlencode传输二进制

(3)PUT(和POST是差不多一样的)

(4)DELETE(和GET类似,一般不带有body,通过query stirng传输数据)

二、Restful 风格的API设计(HTTP的API)

API:应用程序编程接口 Application Programming interface

方法/类(库/框架提供的API)

有些服务器,也可以认为是API的提供者,是网络上的接口

你给这个服务器发一个xxx的请求,服务器给你返回一个xxx的响应,可能提供TCP级别的API(例如RPC框架,形如grpc,thrift,dubbo)

也可能是提供HTTP级别的API(后面在javaee进阶)

咱们需要写一些服务器,提供Http api给别人(浏览器/前端)进行调用,此时就需要有一定的规范约束设计风格

1.通过请求中的方法表示不同的语义

GET:查询

POST:新增

PUT:修改

DELETE:删除

2.通过URL的路径,表示操作的资源

3.请求和响应携带的数据,都尽量使用json格式的数据

json格式的数据:

{

key:value

key2:value2

}

4.通过HTTP响应的状态码,表示失败的原因

按照上述的约定,设计出来的API风格是统一的

三、HTTP的版本号

当前最主流的HTTP版本,响应的版本号,也是在首行,但是在前面

四、HTTP报头(header)

行文本,每一行都是一个键值对。键和值之间使用:空格来进行分割。

header 中的键值对都是标准规定的,(也允许用户自定义),这些header中就存在特定的含义

header的key太多了,不必一一介绍

请求中的header,描述了访问的服务器的IP(域名)和端口(可以省略)

URL中已经存在了访问的服务器的地址和端口,比如针对HTTPS来说,HTTPS是会把header部分都加密的。URL里的服务器的地址端口,就可以和Host加密后的服务器地址和端口做一个校验。

Content-Length: 1554

描述了body的长度

Content-Type: application/json

描述了body的数据格式

上述这两个东西,只有请求/响应中存在body才存在这两个属性

这两个东西共同解决了粘包问题(粘包问题在以前的帖子里有具体阐述,是一个面向字节流传输涉及到的问题,是一个TCP问题,而HTTP就是基于TCP的。如果一个TCP连接中传输多个HTTP请求/响应,此时就需要让应用程序能够区分从哪里到哪里是一个完整的应用层数据包)

byte[] body = new byte[n];

inputStream.ready(body);

HTTP协议,就是按照上述学习的格式,往TCP socket当中读写数据

服务器如何区分出,从哪里到哪里是一个完整的HTTP请求呢?

1)如果没有body,直接读到空行结束  就可以认为请求结束了

2)如果有Body,header中必然存在Content-Length,取出Content-Length的值(字节)。找到空行,空行后面就是body的开始,从开始位置,读Content-Length这么多字节就可以了

常见的Content-Type:

1) text/html

2) text/css

3) application/javascript

4) application/json

5) image/png

6) image/jpg 浏览器/服务器

根据这个 Content - Type 的值 决定 body 如何使用

如果一个请求/响应,虽然有 body 但是没有 Content - Type 或者 Content - Length 。那就是一个非法的“请求/响应” ,比如响应中如果没有 Content - Type ,浏览器会根据 body 中的数据,“猜”一个格式(有较大的概率能猜对) 。如果没有 Content - Length 浏览器也能猜(按照下一个请求一定是 GET/POST 开头)。

这就是鲁棒性:一个系统的 容错能力

英文音译robustness

鲁棒性:健壮性;强健性;耐用性;

即使你对浏览器很粗鲁的返回错误格式的数据,他仍然表现的很棒。

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0

30年前1995年左右的时候,这样的特性非常重要。

计算机/互联网 飞速发展的阶段, 最早的浏览器访问的网站是纯文本的。 后来,有了多媒体(图片,音频,视频) 再后来,有了交互能力(JS) 。再再后来,有了更复杂的交互体系(flash,现在更强的是js体系) 用户手上的浏览器,有的是老版本,只能支持文本 有的是新版本,能够支持上述所有功能。这些全都要,因此要提供多个版本的网站,有的版本只包含文字,有的包含文字和多媒体,有的则全都包含。但是,如今的网站形态基本就定型了,(下一个革命性的变化,可能是VR技术成熟)。在的浏览器上面的功能基本都有。

因此User - Agent现在只有一个作用,那就是可以区分PC端还是移动端 。PC屏幕比较大比较宽,手机屏幕比较窄比较小。有些系统,也开始往多设备上进行演化了。 针对上述区分规则,也不是完全解决问题。 C语言中, 一个指针变量,存地址 地址多长。 你的手机浏览器一般都有功能,修改UA, 在手机上通过修改UA就能够访问电脑版 ,根据用户请求的User - Agent,判定用户使用的浏览器/系统版本 是哪个(也就知道浏览器能支持哪些特性) 前端开发的流行的方式。不用给PC手机维护两个版本的网页。 就一套代码, 这一套代码可以根据浏览器窗口的宽度,自动适应.

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

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

相关文章

文件名是 ‪E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?

去github上下载untrunc 工具就能修复 https://github.com/anthwlock/untrunc/releases 如果访问不了 本机的 hosts文件设置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能访问了 实在不行,从这里下载,传上去了 https://do…

腾讯 CodeBuddy 杀入 AI 编程赛道,能否撼动海外工具霸主地位?

在 AI 编程助手领域,海外的 Cursor 等工具风头正劲,如今腾讯带着 CodeBuddy 隆重登场,国产 AI 编程助手能否借其之力崛起?让我们一探究竟。 官网: 腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 实战安装教程 …

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色常量QColorConstants)

文章目录 一、概述二、颜色常量表标准 Qt 颜色SVG 颜色(部分) 三、Python 代码示例四、代码说明五、版本兼容性六、延伸阅读 一、概述 QColorConstants 是 Qt for Python 提供的一个预定义颜色常量集合,包含标准Qt颜色和SVG规范颜色。这些常…

MATLAB 自然语言处理入门教程

文章目录 前言环境配置一、MATLAB NLP 工具箱概述二、核心功能与 API1. 文本数据准备2. 特征提取3. 文本分类(传统机器学习)4. 深度学习文本分类(LSTM) 三、实战案例:情感分析四、高级应用1. 命名实体识别(…

C++ deque双端队列、deque对象创建、deque赋值操作

在deque中,front()是头部元素,back()指的是尾部元素。begin()是指向头部的迭代器,end()是指向尾部的下一个元素的迭代器。 push_front 头部进行插入 pop_front 尾部进行删除 push_back 尾部进行插入 pop_back 尾部进行删除 deque如果同时…

java每日精进 5.15【分页实现】

1. 什么是对象转换和数据翻译? 对象转换 对象转换是指将一种类型的对象(如数据库实体 UserDO)转换为另一种类型的对象(如前端响应对象 UserVO 或服务层 DTO)。例如,一个 UserDO 包含用户 ID、姓名和部门 …

什么是API接口?API接口的核心价值

随着互联网技术的蓬勃发展,API 接口作为不同应用程序之间的关键纽带,其重要性愈发凸显。本文将从专业视角,深入剖析 API 接口的分类、原理、请求方式以及安全机制等核心要素,助力读者全面理解这一数字化基础设施。 一、API 接口及…

Linux_ELF文件

目录 前言: 一、ELF文件的类型 二、ELF文件的组成格式 1. ELF头部(ELF Header) 2. 节头表(Section Header Table) 3. 程序头表(Program Header Table) 4. 节(Sections)与段(Segments) 三、ELF文件从形成到加载轮廓 1、ELF可执行文件形成过程 2、 可执行文…

Go语言语法---输入控制

文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中,控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法: 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入&#xf…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-C. 常用SQL脚本模板

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录C. 常用SQL脚本模板速查表一、数据清洗与预处理模板二、数据聚合与分析模板三、窗口函数应用模板四、性能优化与监控模板五、数据备份与恢复模板六、权限管理与安全模板七、事务与错误处理模板八、时…

51单片机课设基于GM65模块的二维码加条形码识别

系统组成 主控单元:51单片机(如STC89C52)作为核心控制器,协调各模块工作。 扫描模块:GM65条码扫描头,支持二维码/条形码识别,通过串口(UART)与单片机通信。 显示模块&a…

【OpenGL学习】(二)OpenGL渲染简单图形

文章目录 【OpenGL学习】(二)OpenGL渲染简单图形OpenGL渲染图形流程顶点,图元和片元VAO,VBO ,EBO着色器示例:使用OpenGL渲染三角形 【OpenGL学习】(二)OpenGL渲染简单图形 OpenGL渲…

基于STM32的INA226电压电流检测仪

系统总体框图 功率检测装置原理图功能及模块连接说明 一、系统功能概述 该装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。 二、各模块功能及连接方式 按键模块 功能&#xff1a…

YOLOv2目标检测算法:速度与精度的平衡之道

一、YOLOv2的核心改进:从V1到V2的蜕变 YOLOv2作为YOLO系列的第二代算法,在继承V1端到端、单阶段检测的基础上,针对V1存在的小目标检测弱、定位精度低等问题进行了全方位升级,成为目标检测领域的重要里程碑。 (一&am…

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者: Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector,以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用,或者在本地机器上尝试 Elastic。 多年来…

uniapp取消浏览自动填充

为了防止浏览器自动将记住的密码回填进type"password"输入框&#xff0c;所以在type"password"输入框上面加了两行代码&#xff0c;使浏览器将密码填充到新加的输入框里&#xff0c;并将这两个input隐藏掉 <input type"password" autocomple…

从数据包到可靠性:UDP/TCP协议的工作原理分析

之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么&#xff0c;包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层&#xff0c;对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单&#xf…

显卡、Cuda和pytorch兼容问题

这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一&#xff0c;其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中&#xff0c;无论是本地运行还是云端服务&#xff0c;用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题&#xff0c;提…

Hadoop的目录结构和组成

Hadoop 目录结构 bin 目录&#xff1a;包含了 Hadoop 的各种命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于启动和管理 Hadoop 集群&#xff0c;以及执行各种数据处理任务。etc 目录&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…