問題描述:使用postman進行請求時候,前端的數據,一直在后端接收不到,找了好多資料,竟然是因為一個注解的原因。
后端接收設置:@RequestParam@ReqeustBody設置的原因
因為spring中的ReqeustParam注解接收的參數來自於requestHeader中,即請求頭中,也就是url中,格式為xxx?username=18&password=123,而ReqeustBody注解接收的參數則來自於requestBody中,即請求體中.
前端我使用的是Content-Type默認是
application/json;charset=UTF-8
而服務器是
'Content-Type': 'application/x-www-form-urlencoded'
后端的一些常用的設置為:
一:
如果為get請求時,后台接收參數的注解應該為RequestParam,如果為post請求時,則后台接收參數的注解就是為RequestBody。附上兩個例子,截圖如下:
get請求
@RequestMapping(value = "/anaData") public String selectOrderInfo(@RequestParam("method") String method, @RequestParam Map<String,Object> params) { LOG.debug(TextUtils.format("/***數據 分析模塊,統計查詢 通用方法{0}**/", method)); return analysisClientService.selectOrderInfo(method,params); }
post請求
@PostMapping(value = "/center") public String requestApi(@RequestBody Map<String, Object> params){ loger.debug(TextUtils.format("調用開始------")); return apiCenterClientService.requestApi(params); }
如果參數 有HttpServletRequest需要 注入可以用下面方式
在Controller中注入了HttpServletRequest,形式如下所示:
@RestController public class AutowiredRequestController { @Autowired private HttpServletRequest request; }
不會有線程安全問題!Controller層中所注入的HttpServletReuqest的實現類為JDK動態代理生成的一個代理類,從Request中獲取值的時候是從ThreadLocal中得到的對象中的值。
@RequestParam
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。提交方式為get或post。(Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型)
RequestParam實質是將Request.getParameter() 中的Key-Value參數Map利用Spring的轉化機制ConversionService配置,轉化成參數接收對象或字段。
get方式中query String的值,和post方式中body data的值都會被Servlet接受到並轉化到Request.getParameter()參數集中,所以@RequestParam可以獲取的到
@RequestBody
處理HttpEntity傳遞過來的數據,一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數據。
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。
POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然后綁定到相應的bean上。
@RequestBody用於post請求,不能用於get請求
這里涉及到使用@RequestBody接收不同的對象
1. 創建一個新的entity,將兩個entity都進去。這是最簡單的,但是不夠“優雅”。
2. 用Map<String, Object>接受request body,自己反序列化到各個entity中。
3. 類似方法2,不過更為generic,實現自己的HandlerMethodArgumentResolver。
當前台界面使用GET或POST方式提交數據時,數據編碼格式由請求頭的ContentType指定。分為以下幾種情況:
1. application/x-www-form-urlencoded,這種情況的數據@RequestParam、@ModelAttribute可以處理,@RequestBody也可以處理。
2. multipart/form-data,@RequestBody不能處理這種格式的數據。(form表單里面有文件上傳時,必須要指定enctype屬性值為multipart/form-data,意思是以二進制流的形式傳輸文件。)
3. application/json、application/xml等格式的數據,必須使用@RequestBody來處理。
在這里卡住了,卡的可難受了.留下這個,給自己長點記性