@ResponseBody、@RequestBody和@RequestParam

@ResponseBody 注解

@ResponseBody 注解的作用是將Controller的方法返回的對象,通過轉(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,寫入到 Response 對象的 body 區(qū),常用來返回 JSON 數(shù)據(jù)或 XML 數(shù)據(jù) 。

注意:在使用此注解之后不會再走視圖處理器,而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過 Response 對象輸出指定格式的數(shù)據(jù) 。

  1. @ResponseBody 也可以直接作用在類上的 ,最典型的例子就是 @RestController 這個(gè)注解,它就包含了 @ResponseBody 這個(gè)注解(@RestController=@ResponseBody+@Controller)

  2. 在類上用@RestController,其內(nèi)的所有方法都會默認(rèn)加上@ResponseBody,也就是默認(rèn)返回JSON格式。如果某些方法不是返回JSON的,就只能用@Controller了吧,這也是它們倆的區(qū)別。

1. @ResponseBody作用在方法上 。

@Controller
public class HelloWorld {
    @RequestMapping("/hello")
    @ResponseBody
    public String testSpringBoot() {
        return "Hello SpringBoot 2 !";
    }
}
image.png

如上圖所示:在使用 @RequestMapping后,返回值通常解析為跳轉(zhuǎn)路徑,但是加上 @ResponseBody 后返回結(jié)果不會被解析為跳轉(zhuǎn)路徑,而是直接寫入 Http Response Body 中。通常在異步獲取數(shù)據(jù)時(shí)使用(AJAX)。

2. 不使用 @ResponseBody 注解 。

@Controller
@RequestMapping("/springboot")
public class HelloWorld {
    @RequestMapping("/hello")
    //@ResponseBody
    public String testSpringBoot() {
        return "SpringBoot";
    }
}

image.png

SpringBoot .html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1> 峻哥帶你學(xué) SpringBoot !</h1>
</body>
</html>

如上圖所示,當(dāng)你不加@ResponseBody的時(shí)候,代碼在執(zhí)行的時(shí)候,它就會給你解析成跳轉(zhuǎn)路徑進(jìn)行對應(yīng)的跳轉(zhuǎn)。

@RequestBody 注解

1、@RequestBody 作用在方法形參上 。

image.png

如上圖所示,@RequestBody 作用在形參列表上,用于將前臺發(fā)送過來固定格式的數(shù)據(jù)(xml、json)封裝為對應(yīng)的 JavaBean 對象,封裝時(shí)使用到的一個(gè)對象是系統(tǒng)默認(rèn)配置的 HttpMessageConverter進(jìn)行解析,然后封裝到形參上 。

@RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個(gè)對象。

注意:
該注解用于讀取Request請求的body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對象上; 再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到 controller中方法的參數(shù)上。

@requestbody和@requestparams的區(qū)別?

@RequestBody注意:

1、get請求的時(shí)候,沒有請求體,因此用@RequestBody來接收參數(shù)會報(bào)錯,錯誤狀態(tài)碼:400,詳情是:required request body is missing.....
2、post請求的時(shí)候,有請求體,但默認(rèn)的內(nèi)容格式是:application/x-www-form-urlencoded類型(也就是key1 = val1&key2=val2,因?yàn)楸韱蝹鲄⒌恼埱篌w中也是這種格式),用@RequestBody來接收參數(shù)會報(bào)錯,錯誤狀態(tài)碼:415,詳情是:unsupported media type.....

結(jié)論:@requestbody注解在接收參數(shù)的時(shí)候的請求,必須要有請求體(官方文檔:You can use the @RequestBody annotation to have the request body read and deserialized into an Object through an HttpMessageConverter.)
目前在我認(rèn)知的范圍內(nèi):在有請求體的前提下,格式包括application/json, application/xml使用@RequestBody來處理

@RequestBody

處理HttpEntity傳遞過來的數(shù)據(jù),一般用來處理Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù)。
GET請求中,因?yàn)闆]有HttpEntity,所以@RequestBody并不適用。
POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,

SpringMVC通過使用HandlerAdapter(處理適配器) 配置的HttpMessageConverters(消息轉(zhuǎn)換工具)來解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。

@RequestParam

用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。
(Http協(xié)議中,如果不指定Content-Type(MIME類型),則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類型
1、瀏覽器的原生form表單
2、提交的數(shù)據(jù)都按照key1 = val1&key2=val2的方式進(jìn)行編碼,key和val都進(jìn)行了URL轉(zhuǎn)碼)

RequestParam可以接受簡單類型的屬性,也可以接受對象類型。

實(shí)質(zhì)是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉(zhuǎn)化機(jī)制ConversionService配置,轉(zhuǎn)化成參數(shù)接收對象或字段。

如果在請求中設(shè)置Content-Type:application/json,那么在接收參數(shù)的時(shí)候會將整個(gè)對象以json字符串的形式傳遞到后臺,無法單獨(dú)綁定單獨(dú)屬性

————————————————
版權(quán)聲明:本文為CSDN博主「歌手愛編程」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_47267820/article/details/120286105

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容