欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot傳遞單一參數(shù)時(shí)@RequestParam和@RequestBody的區(qū)別小結(jié)

 更新時(shí)間:2023年08月25日 09:34:01   作者:SiegfriedG  
用SpringBoot框架做項(xiàng)目時(shí),經(jīng)常需要前端給后端傳遞參數(shù),本文主要介紹了SpringBoot傳遞單一參數(shù)時(shí)@RequestParam和@RequestBody的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下

用SpringBoot框架做項(xiàng)目時(shí),經(jīng)常需要前端給后端傳遞參數(shù),如果需要多條參數(shù),通常的做法是把這些參數(shù)封裝為一個(gè)對(duì)象來(lái)傳遞,前端用POST方式調(diào)用。但有時(shí)會(huì)遇到后端只需要一條參數(shù)(比如一個(gè)String)的情況,此時(shí)如果還封裝為一個(gè)對(duì)象,有些多余;最好的辦法是用GET方式調(diào)用,直接把參數(shù)拼接在url后面。但,一般項(xiàng)目都有統(tǒng)一的接口規(guī)范,要求接口都要用POST方式,此時(shí)就遇到一個(gè)問(wèn)題:controller方法上到底是用@RequestParam注解還是用@RequestBody注解?

之前對(duì)這兩個(gè)注解的區(qū)別,只有一個(gè)粗枝大葉的理解——@RequestParam針對(duì)單一的參數(shù),而@RequestBody針對(duì)多個(gè)參數(shù)封裝為一個(gè)對(duì)象,問(wèn)了身邊幾個(gè)同事,大概也都是這種理解。但是,實(shí)際測(cè)試中(使用Postman),當(dāng)我用@RequestParam接受String的單一參數(shù)時(shí),前端給我傳遞的參數(shù)卻接收不到。于是決定通過(guò)實(shí)驗(yàn),徹底搞明白二者的區(qū)別(針對(duì)單一參數(shù)、POST方法的場(chǎng)景)。實(shí)驗(yàn)的過(guò)程是分別用@RequestParam和@RequestBody兩個(gè)注解去接受前端傳遞的一個(gè)名為content的String。

實(shí)驗(yàn)一:使用@RequestParam注解

Controller方法代碼:(省略其他部分以及返回值Result代碼)

@RequestMapping(value="/requestParam", method= RequestMethod.POST, produces = "application/json;charset=UTF-8")
public Result<String> requestParam(@RequestParam("content") String content) {
	System.out.println("content:"+content);
	return success(new Result<String>(), content);

現(xiàn)在我用postman來(lái)測(cè)試幾種可能的參數(shù)傳遞方式:

1. 在Body的raw里面?zhèn)鬟f,也是最通常的傳參方式:

body-raw

結(jié)果是接收不到(不管是用text還是json等各種文本形式)!

 { "timestamp": 1544798083474,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
    "message": "Required String parameter 'content' is not present",
    "path": "/testParam/requestParam"
  }

2. 在Headers里通過(guò)key-value的形式傳遞。這是網(wǎng)上一些帖子里說(shuō)的方式。

Headers方式

但結(jié)果還是接收不到!和上面一樣報(bào)錯(cuò)400。

關(guān)于這一點(diǎn),網(wǎng)上有些帖子里說(shuō)@RequestParam的參數(shù)會(huì)寫到Headers里,可見(jiàn)是錯(cuò)誤的,并非在Headers里,還是在Body里。

3. 在Body的form-data里通過(guò)key-value的形式傳遞,可以接收!

form-data

但是,前端調(diào)后端接口傳參時(shí),是無(wú)法向這個(gè)form-data里傳遞參數(shù)的,所以這種方法只能被排除。

4. 在url后問(wèn)號(hào)拼接參數(shù)。和很多人一樣,之前一直根深蒂固地認(rèn)為只有GET方式才能用url問(wèn)號(hào)傳參,POST方式不行,但事實(shí)證明在這里問(wèn)號(hào)傳參POST方式同樣能接收到。如圖:

問(wèn)號(hào)傳參

雖然能接受到參數(shù),但前端也有統(tǒng)一的規(guī)范,一般不使用問(wèn)號(hào)傳參的方式,所以這種方法也被排除。

實(shí)驗(yàn)二:使用@RequestBody注解

@RequestMapping(value="/requestBody", method= RequestMethod.POST, produces = "application/json;charset=UTF-8")
public Result<String> requestBody(@RequestBody String content) {
	System.out.println("content:"+content);
	return success(new Result<String>(), content);
}

既然是Body,自然不能在header里傳參,也不能在url里問(wèn)號(hào)傳參。至于Body的form-data,經(jīng)測(cè)試也無(wú)效。所以,這里只有唯一一種方式,就是將參數(shù)直接寫在Body的raw模式下,實(shí)驗(yàn)結(jié)果:可以接收到,如圖:

body

注意:這里body體里面?zhèn)魇裁磧?nèi)容,后臺(tái)就會(huì)原樣接收,所以不要寫成content: XXX這種鍵值對(duì)形式,而應(yīng)直接把String的內(nèi)容寫在body體里。

總結(jié):

對(duì)于傳遞單一參數(shù)(最典型的是String)的場(chǎng)合,理論上最簡(jiǎn)便的方法是用GET請(qǐng)求。但鑒于很多項(xiàng)目接口統(tǒng)一要求使用POST方式,此時(shí)不能使用@RequestParam方式,因?yàn)榇朔绞角岸藗鬟f的參數(shù)后端無(wú)法接收;而只能用@RequestBody,直接將需要的參數(shù)內(nèi)容寫入Body體,后端即可正常獲取!

到此這篇關(guān)于SpringBoot傳遞單一參數(shù)時(shí)@RequestParam和@RequestBody的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot @RequestParam @RequestBody內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Storm框架整合springboot的方法

    Storm框架整合springboot的方法

    Storm框架中的每個(gè)Spout和Bolt都相當(dāng)于獨(dú)立的應(yīng)用,Strom在啟動(dòng)spout和bolt時(shí)提供了一個(gè)open方法(spout)和prepare方法(bolt)。這篇文章主要介紹了Storm框架整合springboot的方法,需要的朋友可以參考下
    2018-11-11
  • SpringBoot 日志的配置及輸出應(yīng)用教程

    SpringBoot 日志的配置及輸出應(yīng)用教程

    Spring Boot 默認(rèn)使用 SLF4J+Logback 記錄日志,并提供了默認(rèn)配置。本文我們將重點(diǎn)介紹Spring Boot日志的配置及輸出。感興趣的小伙伴可以了解一下
    2021-12-12
  • Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程

    Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程

    以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 解析MyBatis源碼實(shí)現(xiàn)自定義持久層框架

    解析MyBatis源碼實(shí)現(xiàn)自定義持久層框架

    這篇文章主要介紹了手撕MyBatis源碼實(shí)現(xiàn)自定義持久層框架,涉及到的設(shè)計(jì)模式有Builder構(gòu)建者模式、??模式、代理模式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java銀行取錢線程安全問(wèn)題實(shí)例分析

    Java銀行取錢線程安全問(wèn)題實(shí)例分析

    這篇文章主要介紹了Java銀行取錢線程安全問(wèn)題,結(jié)合具體實(shí)例形式分析了java使用線程操作模擬銀行取錢的相關(guān)安全問(wèn)題,需要的朋友可以參考下
    2019-09-09
  • SpringBoot2零基礎(chǔ)到精通之profile功能與自定義starter

    SpringBoot2零基礎(chǔ)到精通之profile功能與自定義starter

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)profile功能與自定義starter
    2022-03-03
  • Java常用類之比較器的使用詳解

    Java常用類之比較器的使用詳解

    這篇文章主要為大家詳細(xì)介紹了Java中比較器的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2022-11-11
  • Spring Security 中細(xì)化權(quán)限粒度的方法

    Spring Security 中細(xì)化權(quán)限粒度的方法

    這篇文章主要介紹了Spring Security 中細(xì)化權(quán)限粒度的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 關(guān)于spring中事務(wù)的傳播機(jī)制

    關(guān)于spring中事務(wù)的傳播機(jī)制

    這篇文章主要介紹了關(guān)于spring中事務(wù)的傳播機(jī)制,所謂事務(wù)傳播機(jī)制,也就是在事務(wù)在多個(gè)方法的調(diào)用中是如何傳遞的,是重新創(chuàng)建事務(wù)還是使用父方法的事務(wù),需要的朋友可以參考下
    2023-05-05
  • eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名

    eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名

    這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評(píng)論