1、HTTP请求传递参数分类
1.1、按照请求方式分类
GET方法
:通过查询字符串(Query String,每个参数由参数名和参数值组成,使用等号=
连接,不同参数之间使用&
符号分隔)的方式或直接将参数放在URL中来传递参数POST方法
:通过请求体(body)以表单形式或JSON数据格式等编码方式传递参数PUT方法
:与POST方法类似,通过请求体以JSON等格式传递参数,但PUT方法通常用于更新操作DELETE方法
:与POST方法类似,通过请求体以JSON等格式传递参数,但DELETE方法通常用于删除操作
在早期版本的HTTP中,只定义了GET和POST两种请求方法,用于获取和提交资源,然而,为了更好地支持RESTful架构和其他类型的操作,HTTP/1.1版本增加了PUT和DELETE这两种请求方法,使得开发者能够更灵活地设计和实现与资源相关的操作,尽管HTTP/1.1引入了PUT和DELETE请求方法,但其具体使用仍受到服务器和应用程序的支持与限制。不同的服务器和框架可能对PUT和DELETE请求方法有不同的处理方式和约束条件。
1.2、按照数据格式(Content-Type)分类
**Content-Type说明:**当参数放在 URL 中作为查询参数时,并没有 Content-Type。在这种情况下,请求头中并不包含 Content-Type 字段,当使用 GET 请求时,常见的方式是将参数直接附加在 URL 的查询字符串中,例如:https://example.com/api?param1=value1¶m2=value2
。这种方式不需要设置 Content-Type,因为参数是直接拼接在 URL 中的,而非放在请求体中。
Content-Type主要用于 POST、PUT 等通过请求体传递参数的请求方法,表示请求体中的数据类型。对于这些请求,参数通常会放在请求体中进行传输。在这种情况下,需要设置合适的 Content-Type
来指定请求体中数据的格式,如 application/x-www-form-urlencoded
、multipart/form-data
或 application/json
等。
Content-Type分类:
①application/x-www-form-urlencoded
一般用于 POST 请求数据的格式,它通常用于向服务器提交表单数据。在 application/x-www-form-urlencoded
格式中,请求参数被编码为键值对,每个键值对之间使用 "&" 符号进行分隔,键与值之间使用 "=" 符号进行分隔。键和值中的特殊字符会被转义成它们的 ASCII 码值的十六进制表示,即使用百分号 "%" 后跟两位十六进制数表示。其和 query 差不多,都是利用 &
来拼接数据,也都要进行URL编码,只不过 form-urlencoded
把这个字符串放在 body 里了
application/x-www-form-urlencoded
请求示例:
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=john&password=123456
后端控制层代码:
java
@PostMapping("/api/login")
public ResponseEntity<String> login(@RequestParam("username") String username,
@RequestParam("password") String password) {
//......
}
②multipart/form-data
通常用于提交包含文件上传等二进制数据的表单,--------- + 随机数
做为分隔符。相比较于application/x-www-form-urlencoded
编码方式,multipart/form-data
能够支持更大的数据量和更多类型的数据。在使用multipart/form-data
时,表单数据被分割成多个部分进行传输,每个部分都有自己的Content-Type,并且可以携带自己的额外信息(比如文件名、字符集等),因此也被称为多部分表单编码方式。multipart/form-data
通常用于上传文件,因为它支持二进制数据的传输。当使用普通的application/x-www-form-urlencoded
编码方式时,无法直接传输二进制数据,而multipart/form-data
编码方式可以将文件以及其他表单字段一起作为请求体进行传输。
通过multipart/form-data
编码方式,可以将文件的内容直接作为请求的一部分发送到服务器。在服务器端,可以通过解析multipart/form-data
请求来处理文件上传操作,并将上传的文件保存到服务器的文件系统或进行其他的业务逻辑处理。
multipart/form-data
请求的示例:
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg
(二进制文件内容)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="title"
Example title
----WebKitFormBoundary7MA4YWxkTrZu0gW--
后端控制层代码:
java
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file,
@RequestParam("title") String title) {
//......
}
③text/plain
(raw
,即原始数据)
一种简单的文本格式,没有特殊的格式要求和编码规则。通常,使用 text/plain 格式传输的数据只包含 ASCII 字符集中的字符,对于 Unicode 字符集中的字符可能会出现乱码情况。因此,在需要传输非 ASCII 字符集中的字符时,通常会选择使用其他格式,如 UTF-8 编码的文本格式(text/plain;charset=UTF-8)
text/plain 格式通常用于传输纯文本数据,例如 HTML、CSS 和 JavaScript 代码、日志记录等。在 HTTP 请求中,当 Content-Type 字段的值为 text/plain 时,服务器会将请求体中的数据作为纯文本进行处理。在 HTTP 响应中,当 Content-Type 字段的值为 text/plain 时,客户端会将响应体中的数据作为纯文本进行处理
④application/xml
将XML格式的数据放置于请求体中传递,或者将服务器返回的XML格式数据作为响应体发送给客户端。
application/xml
请求和响应的示例:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/xml
<user>
<name>John Doe</name>
<email>john.doe@example.com</email>
<age>30</age>
</user>
后端控制层:
java
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
//......
}
⑤application/json
将参数以JSON格式编码并放置于请求体中传递,通常用于在HTTP请求和响应中传输JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,易于读写和解析,并且被广泛用于Web应用程序和API中。
application/json
请求示例:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john.doe@example.com",
"age": 30
}
后端控制层:
java
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
//......
}
1.3、按照参数作用范围分类
①查询参数(Query Param):在GET方法中出现,以键值对的形式出现在URL的查询字符串中,用于过滤、排序等操作。在请求url后面加上?以键值对的方式传递参数,利用 &
来分割数据
②路径参数(Path Param):在Get方法中出现,直接在 url 后面加上参数,后端使用占位符。
③请求体(Request Body):在POST、PUT和DELETE等方法中出现,用于传递请求的具体数据,通过Content-Type
指明数据格式。
2、扩展
2.1、URL编码
URL中传递的参数通常都需要进行URL编码,以确保特殊字符不会破坏URL的结构。当使用带有占位符的URL时,需要将占位符中的实际值进行URL编码,并将编码后的值替换到相应的占位符位置。URL编码也称为百分号编码(Percent-encoding),它使用%XX的形式表示ASCII字符集中的非可打印字符和一些特殊字符。
例如,空格在URL中是不允许出现的,如果需要在URL中传递包含空格的字符串,就需要对空格进行编码。空格的ASCII码是32,它可以被编码为%20,因此传递包含空格的字符串时,应该将空格替换为%20。类似地,其他特殊字符也需要进行编码,例如"/"应该编码为"%2F","?"应该编码为"%3F",等等。
浏览器和其他HTTP客户端通常会自动对URL中的参数进行编码,因此开发者不需要手动进行URL编码。在服务端,后台框架和程序库通常也提供了相关的API,用于解析和处理URL中的参数。无论是客户端还是服务端,在处理URL参数时,都应该遵守相应的规范和标准,以确保程序的正确性和安全性。