HTTP请求中Get、Post与后台参数接收的分析

前言:在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

目录

第一章 Get请求

第二章 Post请求

2.1 application/x-www-form-urlencoded

2.2 multipart/form-data

2.3 application/json

第三章 是否所有的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类型的,只不过是后台根据既定的解析规则接收不到值罢了,但是确实可以这样设置。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章