注解@RequestParam接收的參數(shù)是來自HTTP請求體或請求url的QueryString中。
RequestParam可以接受簡單類型的屬性,也可以接受對象類型。
@RequestParam有三個配置參數(shù):
required
表示是否必須,默認為 true
,必須。defaultValue
可設置請求參數(shù)的默認值。value
為接收url的參數(shù)名(相當于key值)。@RequestParam用來處理 Content-Type
為 application/x-www-form-urlencoded
編碼的內(nèi)容,Content-Type
默認為該屬性。@RequestParam也可用于其它類型的請求,例如:POST、DELETE等請求。
所以在postman中,要選擇body的類型為 x-www-form-urlencoded
,這樣在headers中就自動變?yōu)榱?Content-Type
: application/x-www-form-urlencoded
編碼格式。如下圖所示:
但是這樣不支持批量插入數(shù)據(jù)啊,如果改用 json
字符串來傳值的話,類型設置為 application/json
,點擊發(fā)送的話,會報錯,后臺接收不到值,為 null
。
但可以入?yún)⒑笤俎D換,參考如下:
- @PostMapping("/ali-receive")
- public void aliReceive(@RequestParam("message") String message) {
- ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
- }
解決Spring/SpringBoot @RequestParam注解無法讀取application/json格式數(shù)據(jù):https://blog.csdn.net/weixin_42536015/article/details/106906055
@RequestParam 接受JSON的字符串:https://blog.csdn.net/qq_40470612/article/details/104225419
不推薦使用@RequestParam接收application/json,這時候就需要使用到@RequestBody。
注解@RequestBody接收的參數(shù)是來自requestBody中,即請求體。一般用于處理非 Content-Type: application/x-www-form-urlencoded
編碼格式的數(shù)據(jù),比如:application/json
、application/xml
等類型的數(shù)據(jù)。
就application/json
類型的數(shù)據(jù)而言,使用注解@RequestBody可以將body里面所有的json數(shù)據(jù)傳到后端,后端再進行解析。
GET請求中,因為沒有HttpEntity,所以@RequestBody并不適用。
POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過使用
HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數(shù)據(jù),然后綁定到相應的bean上。
向表中批量插入數(shù)據(jù)
舉個批量插入數(shù)據(jù)的例子,Controller層的寫法如下圖所示:
由于@RequestBody可用來處理 Content-Type
為 application/json
編碼的內(nèi)容,所以在postman中,選擇body的類型為row
-> JSON(application/json)
,這樣在 Headers
中也會自動變?yōu)?Content-Type
: application/json
編碼格式。body內(nèi)的數(shù)據(jù)如下圖所示:
批量向表中插入兩條數(shù)據(jù),這里的 saveBatchNovel()
方法已經(jīng)封裝了 JPA
的 saveAll()
方法。body
里面的 json
語句的 key
值要與后端實體類的屬性一一對應。
注意:前端使用$.ajax的話,一定要指定 contentType: "application/json;charset=utf-8;"
,默認為 application/x-www-form-urlencoded
。
后端解析json數(shù)據(jù)
上述示例是傳遞到實體類中的具體寫法,那么如果傳遞到非實體類中,body里面的json數(shù)據(jù)需要怎么解析呢?我們再來看下面這個例子:
在body中,我們還是輸入上面的json數(shù)據(jù),根據(jù)分析,上面的json數(shù)據(jù)是一個List數(shù)組內(nèi)嵌套著map對象,那么在后臺的接收形式可寫為 List<Map<String, String>>
,具體代碼如下圖所示:
postman請求:
控制臺輸出:
得出結論,通過@RequestBody可以解析Body中json格式的數(shù)據(jù)。
@RequestBody --> JSON字符串部分
@RequestParam --> 請求參數(shù)部分
application/json格局圖
form-data、x-www-form-urlencoded格局圖
① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。見postman的格局,這兩種方式的時候沒有json字符串部分。
② application/json:json字符串部分可以用@RequestBody;url中的?后面參數(shù)可以用@RequestParam。見postman的格局
@RequestBody
- (@RequestBody Map map)
- (@RequestBody Object object)
- application/json時候可用
- form-data、x-www-form-urlencoded時候不可用
@RequestParam
- (@RequestParam Map map)
- application/json時候,json字符串部分不可用,url中的?后面添加參數(shù)即可用,form-data、x-www-form-urlencoded時候可用,但是要將Headers里的Content-Type刪掉
- (@RequestParam String waterEleId,@RequestParam String enterpriseName)
- application/json時候,json字符串部分不可用,url中的?后面添加參數(shù)即可用
- form-data、x-www-form-urlencoded時候可用,且參數(shù)可以沒有順序(即前端傳過來的參數(shù)或者url中的參數(shù)順序不必和后臺接口中的參數(shù)順序一致,只要字段名相同就可以),但是要將Headers里的Content-Type刪掉
- (@RequestParam Object object)
- 不管application/json、form-data、x-www-form-urlencoded都不可用
既不是@RequestBody也不是@RequestParam,沒有指定參數(shù)哪種接收方式
- (Map map)
- (Object object)
- application/json時候:json字符串部分不可用,url中的?后面添加參數(shù)不可用。
- 因為沒有指定,它也不知道到底是用json字符串部分還是?后面添加參數(shù)部分,所以干脆都不可以用
- form-data、x-www-form-urlencoded時都不可用,見圖二
- (HttpServletRequest request)
- application/json不可用
- form-data、x-www-form-urlencoded時可用
@RequestBody
- RequestBody -- Map / Object
- GET請求中不可以使用@RequestBody
@RequestParam
- (@RequestParam Map map)
- 在url中的?后面添加參數(shù)即可使用
- (@RequestParam String waterEleId,@RequestParam String enterpriseName)
- 在url中的?后面添加參數(shù)即可使用
- (@RequestParam Object object)
- GET請求中不可以使用
當使用GET請求時,通過postman添加?后面的參數(shù),不用在url中自己一個一個拼,點擊Params,在下面key-value中輸入就自動拼接到url中
上傳文件,包含了圖中圈出來的兩部分
如果這樣,沒有@RequestParam,那么url?后的參數(shù)就拿不到
- @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
- public ResponseObj<Boolean> leadingIn(Map formData,
- HttpServletRequest request,
- Map<String, InputStream> files) {
- }
如果control中這樣接收,本來想formData只接收url?后的參數(shù),結果將{ "retCode": null, "data": true }這部分內(nèi)容也拿到了,真實意外之喜。字符串這部分內(nèi)容還可以從request中取到,見下面完整方法。
- @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
- public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
- HttpServletRequest request,
- Map<String, InputStream> files) {
- }
完整方法
- /**
- * 導入
- */
- @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
- public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
- HttpServletRequest request,
- Map<String, InputStream> files) {
- //測試
- try {
- MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
- Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet();
- Map<String, InputStream> listFile = new LinkedHashMap<>();
- System.out.println("個數(shù)" + set.size());
- for (Map.Entry<String, MultipartFile> each : set) {
- String fileName = each.getKey();
- MultipartFile file = each.getValue();
- //這里需要上傳FTP
- try {
- listFile.put(fileName, file.getInputStream());
- } catch (Exception ex) {
- return new ResponseObj<>(false, null);
- }
- }
- String formjson = mulRequest.getParameter("content");
- ObjectMapper mapper = new ObjectMapper();
- mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- // boolean result = iInstallWorkOrder.upLoadFile(listFile);
- boolean result = true;
- return new ResponseObj<>(result, null);
- } catch (Exception ex) {
- System.out.println(ex.toString());
- return new ResponseObj<>(false, null);
- }
- }
按F12看一下Network里對應請求:
使用@RequestParam:Content-Type為application/x-www-form-urlencoded,參數(shù)在FormData中
另外,還有一種應用場景,接口規(guī)范為resultful風格時,舉個例子:如果要獲取某個id下此條問題答案的查詢次數(shù)的話,則后臺就需要動態(tài)獲取參數(shù),其注解為@PathVariable,并且requestMapping中的value應為value="/{id}/queryNum",截圖如下:
參考:
@RequestParam @RequestBody @PathVariable 等參數(shù)綁定注解詳解
https://blog.csdn.net/walkerjong/article/details/7946109
https://my.oschina.net/u/3372000/blog/906217