Feign調用的時候,從上游傳遞不同的Content-Type類型,不同的註解來匹配解析。
首先是從一個錯誤引出來這個問題,在SpringBoot中調用Feign方法:
HTTP Status 400 - Required String parameter 'xx' is not present
Content-Type : application/json ,使用 @RequestBody 可以將json串轉化爲對象。
Content-Type : application/x-www-form-urlencoded, 使用 @RequestParam 一個個獲取請求的表單類型。
摘錄下面的文件,解釋的很清楚。 https://www.cnblogs.com/FrankLei/p/6579843.html
摘錄其中一段,對比 @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用來指示參數是否必須綁定;
示例代碼:
@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {
// ...
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
// ...
@RequestBody
該註解常用來處理Content-Type: 不是application/x-www-form-urlencoded
編碼的內容,例如application/json, application/xml等;
它是通過使用HandlerAdapter 配置的HttpMessageConverters
來解析post data body,然後綁定到相應的bean上的。
因爲配置有FormHttpMessageConverter,所以也可以用來處理 application/x-www-form-urlencoded
的內容,處理完的結果放在一個MultiValueMap<String, String>裏,這種情況在某些特殊需求下使用,詳情查看FormHttpMessageConverter api;
示例代碼:
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}