您好,登錄后才能下訂單哦!
本篇內容主要講解“@RequestParam與@RequestBody的使用區別有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“@RequestParam與@RequestBody的使用區別有哪些”吧!
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。
(Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型)
RequestParam可以接受簡單類型的屬性,也可以接受對象類型。
實質是將Request.getParameter() 中的Key-Value參數Map利用Spring的轉化機制ConversionService配置,轉化成參數接收對象或字段。
在Content-Type: application/x-www-form-urlencoded的請求中,
get 方式中queryString的值,和post方式中 body data的值都會被Servlet接受到并轉化到Request.getParameter()參數集中,所以@RequestParam可以獲取的到。
代碼示例:
@GetMapping("/test-sentinel-resource") public String testSentinelResource(@RequestParam(required = false) String a) { if (StringUtils.isBlank(a)) { throw new IllegalArgumentException("a cannot be blank."); } return a; }
當 required = false 時,a參數為可為空,當 required= true時,a參數不可為空。
一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數據。
GET請求中,因為沒有HttpEntity,所以@RequestBody并不適用。
POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來
解析HttpEntity中的數據,然后綁定到相應的bean上。
就application/json類型的數據而言,使用注解@RequestBody可以將body里面所有的json數據傳到后端,后端再進行解析。
GET請求中,因為沒有HttpEntity,所以@RequestBody并不適用。
POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用
HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然后綁定到相應的bean上。
@PostMapping("/create/user") public UserInfo createUser(@RequestBody CreateUserRequest request) { return userService.createUser(request); }
小結一下:
1. form-data、x-www-form-urlencoded:不可以用@RequestBody;
2. application/json:json字符串部分可以用@RequestBody;url中的?后面參數可以用@RequestParam
3. get請求中不能用@RequestBody注解
spring的RequestParam注解接收的參數是來自于requestHeader中,即請求頭。都是用來獲取請求路徑(url )中的動態參數。也就是在url中,格式為xxx?username=123&password=456。功能與@pathvarible。
RequestBody注解接收的參數則是來自于requestBody中,即請求體中。
知識點:
內容類型,一般是指網頁中存在的Content-Type,用于定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個文件,這就是經常看到一些Asp網頁點擊的結果卻是下載到的一個文件或一張圖片的原因。
看現象如下:發現ajaxDate有若干種寫法。
(1)直接寫名傳參。如下:
打印ajaxDate如下格式:
雖然打印結果是json對象式,但最后會轉為key1=value1&key2=value2的格式提交到后臺 ,不需要加@requestBody。
(2)serializeble實例化表單
打印結果如下:
表單 格式使用的是默認的ContentType類型application/x-www-form-urlencoded,格式為key1=value1&key2=value2提交到后臺 ,不需要加@requestBody。
(3)contentType轉化之后,需要加@requestBody,controller才能接收到數據。
ajaxDate打印結果如下:
post和get功能相同。
前臺將ajaxData轉為json字符串,后臺必須加@RequestBody注解的屬性才能自定映射到值。
為什么有的需要加@requestBody,有的不需要。加與不加的區別如下:
使用@requestBody.當請求content_type為:application/json類型的請求,數據類型為json時, json格式如下:{"aaa":"111","bbb":"222"}
不使用@requestBody.當請求content_type為:application/x-www-form-urlencoded類型的或multipart/form-data時,數據格式為aaa=111&bbb=222。
1.默認的ContentType的值為:application/x-www-form-urlencoded; charset=UTF-8 此格式為表單提交格式,數據為key1=value1&key2=value2的格式 。圖二serrializeble,只用的是默認contentType類型。
2.雖然ajax的data屬性值格式為:{key1:value1,key2:value2},但最后會轉為key1=value1&key2=value2的格式提交到后臺 。
圖二,雖然打印出的結果是不是&格式的,但是會轉化。
3.如果ajax要和springmvc交互,要使用key1=value1&key2=value2的格式,后臺springmvc只需要定義對象或者參數就行了,會自動映射。
4.如果springmvc的參數有@RequestBody注解(接收json**字符串**格式數據),ajax必須將date屬性值轉為json字符串,不能為json對象(js對象,會自動轉為key=value形式)。并且,修改contentType的值為:application/json; charset=UTF-8,這樣加了@RequestBody注解的屬性才能自定映射到值。
5.使用在進行圖片或者文件上傳時使用 multipart/form-data 類型時、 數據會自動進行映射不要添加任何注解。
到此,相信大家對“@RequestParam與@RequestBody的使用區別有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。