zoukankan      html  css  js  c++  java
  • 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会简化数据的处理

  • 相关阅读:
    c语言实现双色球和大乐透
    字符串数组的三种内存模型
    c语言实现数组的排序
    C语言实现二级指针表示字符串数组
    c语言实现字符指针(字符串)数组的排序
    Windows Defender检查文件和应用要管理员设置
    java方法学习1
    The second day of studing English
    Selenium-通过classname定位注意的小问题
    Selenium-ChromeWebDriver
  • 原文地址:https://www.cnblogs.com/knyel/p/8079170.html
Copyright © 2011-2022 走看看