application/json和application/x-www-form-urlencoded使用選擇


一、參考資料

選application/x-www-form-urlencoded還是application/json?

@RequestBody應用

二、理解

1.@RequestBody的作用

注解用於將Controller的方法參數,根據HTTP Request Header的content-Type的內容,通過適當的HttpMessageConverter轉換為JAVA類

使用場景是:POST或者PUT的數據是JSON格式或者XML格式,而不是普通的鍵值對形式.

2.

application/x-www-form-urlencoded通過表單提交,在sevlet實現中,mutipart/form-data和application/x-www-form-urlencoded會被特殊處理,請求參數將被放置於request.paramter,這是一個map。

當我們使用content-type=application/json且后台使用@RequestBody,則無法再從request.paramter中獲取請求數據。

三、實際測試

1.前端js代碼

function saveDwxxBtn() {
    var data={
            sbdw:"1",
            sbdwid:"2",
            sbsm:"3",
            nf:"4"
    }
    $.ajax({
            type:"POST",
            contentType:"application/json",  
            dataType : "json",
            url : 'saveZlsj',
            data : data,
            success : function(result) {
                
            },
            error:function(data){}
            
        });
}

2.后台代碼

@RequestMapping(value="/saveZlsj",method=RequestMethod.POST)
    @ResponseBody
    public AjaxResult saveZlsj(ModelMap model, HttpServletRequest request, Zlsj zlsj) {
        
        AjaxResult result = new AjaxResult();
        try {
            Integer pkid = zlService.saveZlsj(zlsj);
            result.setIntVal(pkid);
        } catch (Exception e) {
            e.printStackTrace();
            result.setStatusCode(0);
            result.setMessage("操作失敗");
        }
        return result;
    }

3.運行結果

1.發現Zlsj並未接收到參數,加上@RequestBody后就可以接收到參數了

2.修改js,改成序列化表單的形式提交代碼,不加@RequestBody可以接收到參數,加上@RequestBody則不能接收到參數

四、總結

如果數據是簡單、平面的key-value鍵值對,那么使用application/x-www-form-urlencoded簡單實用,不需要額外的編解碼

如果數據是復雜的嵌套關系,有多層數據,那么使用application/json會簡化數據的處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM