HTTP 请求
1) 请求组成
请求由三部分组成
- 请求行
- 请求头
- 请求体
请求行(Request Line):
当一个客户端(例如,浏览器)向服务器发送HTTP请求时,请求的第一行就是请求行。请求行包括以下三个部分:
- 请求方法:这是一个动词,如
GET
、POST
、PUT
、DELETE
等,它告诉服务器要执行什么样的操作。 - 请求的URL路径:这是请求的目标资源的路径。
- HTTP协议版本:这表示客户端使用的HTTP协议的版本。
下面是一个请求行的例子:
GET /index.html HTTP/1.1
在这个例子中:
GET
是请求方法,表示客户端希望获取资源。/index.html
是请求的URL路径,表示客户端希望获取的资源。HTTP/1.1
是HTTP协议版本,表示客户端使用的是HTTP 1.1版本的协议。
请求头(Request Headers):
-
请求头包含关于请求的元数据,如用户代理、所需的内容类型、所接受的内容类型等。
-
请求头是由键值对组成的列表,每个键值对之间使用冒号分隔,键和值之间使用空格分隔。
-
例如,一个包含常见请求头的请求可能是这样的:
bashCopy codeHost: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Content-Type【内容】
Content-Type
是一个 HTTP 头部信息,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。它在响应中,向客户端提供返回内容的实际内容类型。
Content-Type
的语法格式如下:
Content-Type: media-type; charset=character-set
其中:
常见的Content-Type
值包括:
- application/x-www-form-urlencoded:【表单默认】
- 这是用于HTML表单数据的默认编码类型。
- 表单数据会以键值对的形式编码,并使用
&
符号分隔。 - 例如:
key1=value1&key2=value2
- multipart/form-data:
- 这是用于在HTML表单中上传文件或二进制数据的编码类型。
- 表单数据会被划分为多个部分,并以多个部分的形式发送到服务器。
- 这种编码类型允许在表单中包含文件上传字段。
- 例如,一个包含文件上传的表单提交的请求可能使用multipart/form-data编码。
- application/json:
- 这是表示JSON数据的媒体类型。
- 当客户端向服务器发送JSON格式的数据时,通常会使用这种类型。
- 例如:
{"key": "value"}
- text/plain:
- 这是纯文本数据的媒体类型。
- 当实体主体包含普通文本时,可以使用这种类型。
- 例如:普通文本消息或文本文件。
- application/xml:
- 这是表示XML数据的媒体类型。
- 当客户端向服务器发送XML格式的数据时,通常会使用这种类型。
- 例如:
<xml><key>value</key></xml>
- image/jpeg、image/png等:
- 这些是表示图像数据的媒体类型。
- 当实体主体包含图像数据时,会使用对应的图像媒体类型。
Content-Type
字段的值告诉服务器如何解析请求的实体主体数据,以及如何格式化响应的实体主体数据。正确设置Content-Type
对于正确解析和处理HTTP请求和响应非常重要。
请求体(Request Body):
-
请求体包含实际发送到服务器的数据,通常用于POST请求或其他需要发送数据的请求。
-
请求体的格式取决于请求的内容类型,例如,对于表单提交,请求体可能是经过URL编码或者多部分形式的数据。
-
例如,对于一个包含表单数据的POST请求,请求体可能是这样的:
makefileCopy code username=user&password=pass
或者对于包含JSON数据的POST请求,请求体可能是这样的:
jsonCopy code {"username": "user", "password": "pass"}
这三部分组成了一个完整的HTTP请求,客户端通过发送这些信息到服务器来请求资源或执行某些操作。
2) 请求方式与数据格式
get 请求示例
GET /test2?name=%E5%BC%A0&age=20 HTTP/1.1
Host: localhost
- %E5%BC%A0 是【张】经过 URL 编码后的结果
GET请求用于向服务器请求特定资源,通常用于获取数据。
请求参数是以URL查询字符串的形式附加在URL之后,以
?
开始,参数之间用&
分隔。GET请求的请求体为空。
GET请求的格式示例:
GET /path/to/resource?param1=value1¶m2=value2 HTTP/1.1 Host: www.example.com
post 请求示例
POST /test2 HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 21
name=%E5%BC%A0&age=18
POST请求用于向服务器提交数据,通常用于向服务器发送数据并创建新的资源。
请求参数通常包含在请求体中,而不是URL中。
POST请求的请求体的格式通常取决于请求的内容类型,可以是经过URL编码的表单数据,也可以是JSON格式的数据等。
POST请求的格式示例(以表单数据为例):
makefileCopy codePOST /path/to/resource HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded param1=value1¶m2=value2
如果POST请求的内容是JSON格式的数据,则请求头中的Content-Type可能是application/json:
bashCopy codePOST /path/to/resource HTTP/1.1 Host: www.example.com Content-Type: application/json {"param1": "value1", "param2": "value2"}
application/x-www-form-urlencoed 格式细节:
- 参数分成名字和值,中间用 = 分隔
- 多个参数使用 & 进行分隔
- 【张】等特殊字符需要用 encodeURIComponent() 编码为 【%E5%BC%A0】后才能发送
url:utf-8编码规则:每个字节转为16进制
json 请求示例
POST /test3 HTTP/1.1
Host: localhost
Content-Type: application/json
Content-Length: 25//发送字节长度
{"name":"zhang","age":18}
json 对象格式
{"属性名":属性值}
其中属性值可以是
- 字符串 “”
- 数字
- true, false
- null
- 对象
- 数组
json 数组格式
[元素1, 元素2, ...]
multipart 请求示例
可以上传文件
分隔符,划分为多部分
POST /test2 HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=123
Content-Length: 125
--123
Content-Disposition: form-data; name="name"
lisi
--123
Content-Disposition: form-data; name="age"
30
--123--
- boundary=123 用来定义分隔符
- 起始分隔符是
--分隔符
- 结束分隔符是
--分隔符--
数据格式小结
客户端发送
- 编码
- application/x-www-form-urlencoded :url 编码 ,将特殊字符进行编码后发送
- application/json:utf-8 编码
- multipart/form-data:每部分编码可以不同
- 表单只支持以 application/x-www-form-urlencoded 和 multipart/form-data 格式发送数据
- 文件上传需要用 multipart/form-data 格式
- js 代码可以支持任意格式发送数据
服务端接收
- 对 application/x-www-form-urlencoded 和 multipart/form-data 格式的数据,Spring 接收方式是统一的,只需要用 java bean 的属性名对应请求参数名即可
- 对于 applicaiton/json 格式的数据,Spring 接收需要使用 @RequestBody 注解 + java bean 的方式
- 对于multipart/form-data格式的数据MultipartFile类型接收