使用Restful風格中的post使用過遇到前端數據傳送不到後端

 問題描述:使用postman進行請求時候,前端的數據,一直在後端接收不到,找了好多資料,居然是由於一個註解的緣由。前端

後端接收設置:@RequestParam@ReqeustBody設置的緣由spring

  由於spring中的ReqeustParam註解接收的參數來自於requestHeader中,即請求頭中,也就是url中,格式爲xxx?username=18&password=123,而ReqeustBody註解接收的參數則來自於requestBody中,即請求體中.json

 

前端我使用的是Content-Type默認是後端

application/json;charset=UTF-8

而服務器是api

'Content-Type': 'application/x-www-form-urlencoded'

 

 

後端的一些經常使用的設置爲:安全

一:服務器

  若是爲get請求時,後臺接收參數的註解應該爲RequestParam,若是爲post請求時,則後臺接收參數的註解就是爲RequestBody。附上兩個例子,截圖以下:app

      get請求post

 @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來處理。

 

在這裏卡住了,卡的可難受了.留下這個,給本身長點記性

相關文章
相關標籤/搜索