前情介绍:
请求参数涉及前后端,前端如何编码,后端如何解码。具体来说,前端涉及:请求方式、请求方式使用场景、请求参数编码、表单参数编码,springboot后端涉及:请求解码、请求参数注入。当你有条理的理清这些东西,就能得心用手的使用和长久的记忆。
参考文档1
参考文档2
请求方式:
- 常用的请求方式:get请求方式、post请求方式。
那么选择一个请求方式意味着什么呢?第一、决定了HTTP报文中的method字段,第二、决定了HTTP报文是否有请求体,get方式决定了请求参数直接跟url拼接,没有请求体,而post方式决定了你的请求参数放在请求体中。注意,以上东西就是教科书上介绍的东西,但是请求参数是怎么组织然后以什么样的格式放在url或请求体中的呢?这就是有请求参数编码决定的。也就是说:协议并没有规定数据必须使用什么编码方式,开发者完全可以自己决定请求主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
请求参数编码:
常见的请求参数编码有三种:
application/x-www-form-urlencoded
multipart/form-data
application/json
它们决定了HTTP报文中Content-Type请求头是什么
- 当选择了一个请求参数编码,又意味着什么呢?如上所述,决定了请求参数是以什么样的格式组织在一起然后放在url中或请求体中。
- 当选择了application/x-www-form-urlencoded:
它主要做了两件事:第一、组织请求参数为以下格式:
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
第二、对中文进行了url编码,每个中文汉字转换成了%xx形式
- 当选择了multipart/form-data:
这是文件提交时用到的编码方式,请求参数被组装成以下格式:即多段传输格式
———WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=”text”
title
———WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=”file”; filename=”chrome.png”
Content-Type: image/png
PNG … content of chrome.png …
———WebKitFormBoundaryrGKCBY7qhFd3TrwA—
- 当选择了application/json:
组织格式:就是json字符串的形式
{“title”:”test”,”sub”:[1,2,3]}
请求方式使用场景:
这是一种什么概念呢?上述既讲了请求方式,又讲了请求参数编码,一种请求方式,能对应不同的请求参数编码方式,那么在不同的使用场景下,它们是如何搭配的呢?
- 首先是针对get请求方式:要明白get请求方式始终使用的是application/x-www-form-urlencoded编码,
即便指定编码方式,也不起作用,或者说get请求方式跟Content-Type没有关系,Content-Type只是决定了请求体中的内容编码方式。也就是说,get方式请求时,url和请求参数总是以下的格式:
http://localhost:8080/ajaxGet?id=1&username=%5B%5D&userTrueName=%5B%5D%6C
具体使用场景:
1. 地址栏直接使用
1. <a>链接
1. form表单提交,method指定为get
1. Ajax请求,type指定为get
$.ajax({
type: “GET”,
url: “http://localhost:8080/ajaxGet“,
data:{“id”:1,”username”:”用户名”,”userTrueName”:”真实名称”}
});
- 针对post请求方式:它可以与上述三种编码方式任意搭配:
- 设置了Content-Type为:application/x-www-form-urlencoded:
这应该是最常见的 POST 提交数据的方式了。浏览器的原生