一.ge请求方式
- get会将参入加入到url中发出请求,所以后台接收参数的时候,用@RequestParam,去接受url中的参数。前端直接传递json格式就可以
- GET 请求没有明确规定,但如果在报文主体中传输数据,不同服务的处理方式也不一定相同,有的可能会被处理,有的可能会被忽略,所以通常 GET 请求没有报文主体,当请求为 GET 时,浏览器用默认的x-www-form-urlencoded的编码方式,表单提交时,把form数据转换成一个多个键值对的字符串(如appkey=3858be3c20ceb6298575736cf27858a7&foreignId=29118&deviceId=29118&bid=),然后把这个字符串追加到URL后面,用问号?分隔,加载这个新的URL。
- 从上面的介绍中,我们知道 Content-Type表示报文中主体的内容类型,而 GET 请求没有报文主体,所以 GET 请求不需要指定 Content-Type,指定Content-Type是没有任何意义的。
二.post 请求的 Content-Type
2.1@RequestBody
使用@RequestBody的话,请求方式必须得是contentType:application/json**
post请求会将请求参数加入到body中,发出请求,请求类型为application/json。所以后台用RequestBody将body传递过来的json,解析成对应的bean。
这种用法的弊端
(1)前端请求必须把要传递的JSON参数,使用JSON.stringify(JSON_Params),转成字符串传递给后台
(2)后台只能接收这个对象,不能再接收这个对象以外的其他值
2.2@RequestParam
如果不加@RequestBody,那么ajax就不需要使用JSON.stringify(JSON_Params),直接传递JSON格式就可以。而且处理接收这个对象,还可以继续接收其他的JSON中的参数。
而且请求类型还必须得是contentType:application/x-www-form-urlencoded。是将请求参数加入到url中,k v对匹配,通过&号连接多个参数
@RequestParam可以接受简单类型的属性,也可以接受对象类型(如viewUserByBean方法)。创建一个实体类对象作为参数承载体,Spring MVC会根据参数名称自动将参数绑定到实体类对象的属性上,viewUserByBean就是这么处理的。
- value:String 类型,请求参数名,如viewUserByEachEle 方法中的userName表示请求参数名,它的值将被绑定到方法参数name。
- required:是否必须,默认值为true,表示请求参数中必须包含对应的参数,否则,将抛出400错误码;异常信息是org.springframework.web.bind.MissingServletRequestParameterException,提示“Required String parameter 'userName' is not present”。
- defaultValue:String 类型,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。
重点:其实如果不使用@RequestParam,Spring MVC也会将request的parameter自动绑定到method的parameter中,使用@RequestParam只不过是对parameter进行配置和对URL更精确化的配置。例如,在请求参数名和方法参数名相同时,则可以省略@RequestParam注解。
三.关于POST的请求中,body传递参数的三种 Content-Type 方式
3.1 multipart/form-data
以键值对的形式传递参数,支持上传文件。根据后台接收的bean,自动转化成指定的bean
后台可以用@RequestParam进行接收参数
3.2 application/x-www-form-urlencoded
以键值对的形式传递参数,不能上传文件。根据后台接收的bean,自动转化成指定的bean
后台可以用@RequestParam进行接收参数
3.3 applition/json(在postman中,是body下的raw,选择JSON)
以json或者xml以及其他格式的数据,转换成字符串的形式,传递参数,不能上传文件。
后台可以用@RequestBody进行接收参数,并自动转化成指定的bean。
四 post请求下,不同 Content-Type,前端对参数处理不同的操作
/**
* post请求数据处理
* @param {*} data 数据对象
* @param {*} openDefultdata 是否开启默认数据?
* @param {*} contentType 数据格式
* json: 'application/json; charset=utf-8'
* form: 'application/x-www-form-urlencoded; charset=utf-8'
*/
http.adornData = (data = {}, openDefultdata = true, contentType = 'json') => {
var defaults = {
't': new Date().getTime()
}
data = openDefultdata ? merge(defaults, data) : data
return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data)
}
五后端对于各种请求的下的操作
post 请求
- 1.1.contentType:application/json
@PostMapping("login")
@ApiOperation("登录")
public R login(@RequestBody LoginForm form){}
- 1.2.contentType:application/x-www-form-urlencoded
@PostMapping("/save")
public R list(@RequestParam String id,@RequestParam String name){}
- 1.3.contentType:multipart/form-data
@PostMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file){}
get 请求
@GetMapping("/list")
public R list(@RequestParam String id){}
网友评论