解析请求参数
首先,我们需要明白什么是请求参数。简单来说,请求参数是传递给服务器的数据,用于传递额外信息,在 API 请求中发挥着关键作用。它们传递不同类型的信息,确保服务器正确处理请求。常见的请求参数类型包括:
- 查询参数(Query Parameters): 以键值对形式附加在 URL 末尾,用于过滤、排序或限制请求结果
- 路径参数: 嵌入在 URL 中,用作资源的唯一标识或区分资源间的细微差异
- 请求体参数:包含在请求体中,传递复杂或大量数据,如表格数据或json对象
查询参数
查询参数以键值对形式附加于 URL 末端,用于调整请求结果
GET http://127.0.0.1:8887/index?name=%E6%98%93%E6%96%87%E6%9D%B0&age=32
200
148 ms
GET /index?name=%E6%98%93%E6%96%87%E6%9D%B0&age=32 HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 2d5777e8-4a3f-43b4-b3b4-60700a895a2f
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 03:43:01 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful"
提交的数据按照key1=val1&key2=val2 的方式进行编码,key和val都进行了 URL转码
路径参数
与查询参数不同,路径参数会作为URL路径的一部分
GET http://127.0.0.1:8887/index/%E6%98%93%E6%96%87%E6%9D%B0
200
138 ms
GET /index/%E6%98%93%E6%96%87%E6%9D%B0 HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: dbbe39e4-0d9e-48fd-85b1-6d89d33fd241
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 03:50:48 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful易文杰"
数据进行 URL转码后,按设定好的位置插入URL路径中
请求体参数
有时需要通过请求体传递更复杂的数据
- Body form-data
- Body x-www-form-urlencode
- Body raw
- Body binary
- Body GraphQL
form-data
对应html中form表单提交传值,相同于http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息。由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件
POST http://127.0.0.1:8887/index
200
12 ms
POST /index HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: d2b29436-472f-446f-a126-febfa9996cbc
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------456066666158987888408108
Content-Length: 5052
----------------------------456066666158987888408108
Content-Disposition: form-data; name="name"
易文杰
----------------------------456066666158987888408108
Content-Disposition: form-data; name="age"
32
----------------------------456066666158987888408108
Content-Disposition: form-data; name="file1"; filename="test.png"
<test.png>
----------------------------456066666158987888408108
Content-Disposition: form-data; name="file2"; filename="test.png"
<test.png>
----------------------------456066666158987888408108--
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 04:01:01 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful"
请求体中的boundary参数指定的就是分隔体,可以看到请求内容被分为了四段,第一段对应name,第二段对应age, 第三段对应file1,第四段对应file4
x-www-form-urlencoded
application/x-www-from-urlencoded,提交的数据按照key1=val1&key2=val2 的方式进行编码,key和val都进行了 URL转码
POST http://127.0.0.1:8887/index
200
49 ms
POST /index HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 40377c1b-1801-499e-8984-02736a1f3011
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
name=%E6%98%93%E6%96%87%E6%9D%B0&age=32
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 04:07:07 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful"
form-data与x-www-form-urlencoded的区别
multipart/form-data适用于需要上传文件或二进制数据的场景。与application/x-www-form-urlencoded不同,它将表单数据编码成一系列分部分(parts),每个部分都有一个唯一的标识符,并且每个部分可以是不同的数据类型,包括文本和二进制数据
典型的使用场景包括文件上传表单、富文本编辑器等需要传输大量二进制数据的场景
比较维度
- 数据类型支持:
multipart/form-data支持上传文件等二进制数据,而application/x-www-form-urlencoded只支持文本数据。 - 传输效率:在传输大量数据时,
multipart/form-data的效率相对较低,因为它需要对数据进行分部分,而application/x-www-form-urlencoded的传输效率较高。 - 兼容性:
application/x-www-form-urlencoded在各种浏览器和服务器上具有很好的兼容性,而multipart/form-data的兼容性较低。 - 安全性:在传输敏感数据时,
multipart/form-data相对更安全,因为它可以对二进制数据进行加密,而application/x-www-form-urlencoded的数据以明文形式传输。 - 易用性和灵活性:
application/x-www-form-urlencoded相对更易用,因为它只需对文本数据进行简单的编码,而multipart/form-data更灵活,可以上传各种类型的数据
使用场景
在实际开发中,根据不同的需求和场景选择合适的表单数据提交方式至关重要。对于简单的表单提交,如登录表单、搜索表单等,可以选择application/x-www-form-urlencoded;而对于需要上传文件或二进制数据的场景,如文件上传表单、富文本编辑器等,则应选择multipart/form-data
raw
raw对应的是入参是任意格式的可以上传任意格式的文本,可以上传text、json、xml、html等
POST http://127.0.0.1:8887/index
200
34 ms
POST /index HTTP/1.1
Content-Type: text/plain
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 5928ef1b-c165-4410-b488-0cd3d8ab2405
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 15
{
"smile"
}
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 04:18:45 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful"
其中不同的格式,对应不同的Content-Type
- Text:Content-Type: text/plain
- JavaScript:Content-Type: application/javascript
- Json:Content-Type: application/json
- HTML:Content-Type: text/html
- XML:Content-Type: application/xml
binary
相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件,与form-data相比,binary直接发送文件的二进制内容,不进行任何编码或处理
POST http://127.0.0.1:8887/index
200
17 ms
POST /index HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 3f166993-f627-4838-b2ce-a91bddfb3a56
Host: 127.0.0.1:8887
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 2240
Content-Type: image/png
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 06 Jul 2024 04:26:39 GMT
Keep-Alive: timeout=60
Connection: keep-alive
"Successful"
总结
- form-data :适合上传文件或复杂表单
- x-www-form-urlencoded :适合简单的表单数据传输
- raw :适合发送纯文本格式的数据,如 JSON 或 XML
- binary :适合发送二进制文件