前言:在http请求时经常碰到这两种方式,经常后台接收不到参数,所以总结一下,不同的请求方式的用处以及在后台如何接收。
参考:
https://www.bbsmax.com/A/amd0E1mDzg/
https://blog.csdn.net/xybelieve1990/article/details/81111786
https://www.cnblogs.com/btgyoyo/p/6141480.html
https://blog.csdn.net/u013827143/article/details/86222486
目录
2.1 application/x-www-form-urlencoded
第三章 是否所有的request请求体都会与content-type对应
第一章 Get请求
get请求比较简单,只是在请求链接后面加上参数。如果使用SpringBoot开发项目,后台接收参数时直接把对应的参数写在函数的方法中即可。
如请求为:
http://xxxx/exportPeople/peoplePackage/like?queryParameter=123
在谷歌的开发者工具中会显示为:
后台的接收为:
@GetMapping("/peoplePackage/like")
public JsonObjectResponse<?> getPeoplePackageByIdOrName(String queryParameter){
//业务处理
}
第二章 Post请求
2.1 application/x-www-form-urlencoded
前端传的content-type为application/x-www-form-urlencoded,这也是默认的请求方式
这样,参数在请求体以标准的Form Data的形式提交,以&符号拼接,参数格式为key=value&key=value&key=value...
可以看到请求体为 参数名=参数值& 的形式组合起来的,和get差不多,只不过一个是在request请求体中,一个是在请求的url中。
在谷歌浏览器的开发者工具里,会显示为
在SpringBoot作为开发的情况下,传数据时用的什么参数,接收时在函数的参数上写上就可以了。
2.2 multipart/form-data
前端传的content-type为application/x-www-form-urlencoded,一般要传文件时会选择这个,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
http工具上传:
js,ajax上传:
var formData = new FormData();
formData.append('file', img.files[0]); //添加图片信息的参数
formData.append('typeCode',typeResCode);//添加其它参数
$.ajax({
url: rep_service_api.resThumbnailUpdate,
headers : {
'Access-Control-Allow-Origin' : '*',
'Return-Data-Type':'json'
},
type: 'POST',
cache: false, //上传文件不需要缓存
data: formData,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: function (data) {
console.log("执行成功函数")
},
error: function (data) {
}
})
在谷歌浏览器的开发者工具里,会显示为:
view source:
在SpringBoot中可以通过MulTipartFile数组接收多个文件,一些其它的参数也可以直接写到函数的参数中,如我上图传了file和typeCode两个参数,后台可以这么接收:
@PostMapping("/resFileUpdate")
public ResultVO resFileUpdate(MultipartFile file, Integer typeCode){
//业务代码
}
2.3 application/json
前端传的content-type为application/json,主要是用来传json数据
谷歌浏览器中显示:
view source:
后台的参数接收:
在SpringBoot中可以通过@RequestBody来接收json,需要在后台建立对应的数据模型,我这里用CreatePeopleForm数据模型来接收传来的json数据。
@PostMapping("/peoplePackage")
public JsonObjectResponse<?> createPeoplePackage(@RequestBody @Validated CreatePeopleForm createPeopleForm, HttpServletRequest request) throws Exception {
//..业务代码略
}
在SpringBoot中也可以用Map来接收json
@RequestMapping(value = "/search",method = RequestMethod.POST)
public void search (@RequestBody Map<String,String> map){
System.out.println("传进来的参数:" + map);
}
补充:
第三章 是否所有的request请求体都会与content-type对应
应该不是的,我某次使用axios请求就出现了下图的所示的情况,可以看到content-type为application/x-www-form-urlencoded,但是请求体里的参数却是json类型的,说明request请求体不一定会和content-type对应。
个人推断:我们平时使用的ajax,axios这些是已经封装好了,所以一般content-type和请求体都会是对应的,但是具体的这些是可以设置的,content-type为application/x-www-form-urlencoded,请求体的数据也可以是json类型的,只不过是后台根据既定的解析规则接收不到值罢了,但是确实可以这样设置。