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類型的,只不過是後臺根據既定的解析規則接收不到值罷了,但是確實可以這樣設置。

 

 

 

 

 

 

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