關於使用spring mvc時出現 HTTP Status 400 - Required String parameter 'xx' is not present

先記錄一下這個錯誤

1、後臺使用sring mvc的@RequestParam接受form表單提交的兩個參數
這裏寫圖片描述

2、使用Postman測試接口,可以看到在使用默認的form-data類型時出現了 HTTP Status 400 - Required String parameter ‘xx’ is not present 這個錯誤
這裏寫圖片描述

3、更換成x-www-form-urlencoded類型時返回成功
這裏寫圖片描述

4、如果使用@RequestBody接收參數,同@RequestParam一樣,都是需要設置x-www-form-urlencoded類型才能正確返回。

再來分析一下這個錯誤的原因

1、先來看一下@RequestBody和@RequestParam的區別

@RequestParam

  • A) 常用來處理簡單類型的綁定,通過Request.getParameter() 獲取的String可直接轉換爲簡單類型的情況(由String到簡單類型的轉換操作由ConversionService配置的轉換器來完成);因爲使用request.getParameter()方式獲取參數,所以可以處理get方式中queryString的值,也可以處理post方式中 body data的值。
  • B)用來處理Content-Type: 爲application/x-www-form-urlencoded編碼的內容,提交方式GET、POST。(不設置這個屬性,這就是默認值)
  • C) 該註解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示參數是否必須綁定。 在方法參數裏面如是:public @ResponseBody JsonResultgetPublishedToposByConnStreamId(@RequestParam(value = “streamId”, required = false) String streamId) {}

@RequestBody

  • A) GET、POST方式提時, 根據request header Content-Type的值來判斷:application/x-www-form-urlencoded, 可選(即非必須,因爲這種情況的數據@RequestParam,@ModelAttribute也可以處理,當然@RequestBody也能處理);multipart/form-data, 不能處理(次類型多用來上傳文件類型—即使用@RequestBody不能處理這種格式的數據,@RequestParam這個卻是可以處理的。);其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);
  • B) PUT方式提交時, 根據request header Content-Type的值來判斷:application/x-www-form-urlencoded, 必須;multipart/form-data, 不能處理;其他格式, 必須;說明:request的body部分的數據編碼格式由header部分的Content-Type指定;

總結:
@RequestBody這個一般處理的是在ajax請求中聲明contentType: “application/json; charset=utf-8”時候。也就是json數據或者xml(我沒用過這個,用的是json)
@RequestParam這個一般就是在ajax裏面沒有聲明contentType的時候,爲默認的urlencode格式時,用這個。

2、spring mvc其他的參數綁定的註釋
handler method 參數綁定常用的註解,一般根據他們處理的Request的不同內容部分分爲四類:(主要講解常用類型)

  • A、處理requet uri 部分(這裏指uri template中variable,不含queryString部分)的註解: @PathVariable;
  • B、處理request header部分的註解: @RequestHeader, @CookieValue;
  • C、處理request body部分的註解:@RequestParam, @RequestBody;
  • D、處理attribute類型是註解: @SessionAttributes, @ModelAttribute;

3、關於http中的Content-Type
MediaType,即是Internet Media Type,互聯網媒體類型;也叫做MIME類型,在Http協議消息頭中,使用Content-Type來表示具體請求中的媒體類型信息。

常見的媒體格式類型如下:

text/html : HTML格式
text/plain :純文本格式      
text/xml :  XML格式
image/gif :gif圖片格式    
image/jpeg :jpg圖片格式 
image/png:png圖片格式

以application開頭的媒體格式類型:

   application/xhtml+xml :XHTML格式
   application/xml     : XML數據格式
   application/atom+xml  :Atom XML聚合格式    
   application/json    : JSON數據格式
   application/pdf       :pdf格式  
   application/msword  : Word文檔格式
   application/octet-stream : 二進制流數據(如常見的文件下載)
   application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼爲key/value格式發送到服務器(表單默認的提交數據的格式)

另外一種常見的媒體格式是上傳文件之時使用的:

multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

以上就是我們在日常的開發中,經常會用到的若干content-type的內容格式。

Spring MVC中關於關於Content-Type類型信息的使用:

  • value: 指定請求的實際地址, 比如 /action/info之類。
  • method:指定請求的method類型,GET、POST、PUT、DELETE等
  • consumes:指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
  • produces: 指定返回的內容類型,僅當request請求頭中(Accept)類型中包含該指定類型才返回
  • params:指定request中必須包含某些參數值是,才讓該方法處理
  • headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求

總結

一個比較細節的錯誤,主要是因爲自己的一些知識盲點,對content-type和spring mvc參數綁定的不夠了解,因爲在網上也沒有看到合理的說明,就自己記錄一下,今後在開發中也要不斷的發現問題,解決問題並且記錄和總結問題。

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