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会简化数据的处理

原文地址:https://www.cnblogs.com/knyel/p/8079170.html