• 转:POST 400 Bad Request The request sent by the client was syntactically incorrect


    最近在做Web开发的时候,使用$.post提交数据,但是回调函数却没有被触发,按F12看控制台输出是:POST *** 400 Bad Request

    后台是SpringMVC的,设置了断点也不会被触发。

    后来查看JQuery资料了解到,$.post提交数据只有成功时才触发回调函数,于是改用$.ajax提交数据,添加error回调函数,得到错误信息了,如下图:

    这个问题是什么原因造成的呢?

    后来经过测试发现,是表单提交的内容数据类型与实体的(也就是数据表字段)的数据类型不匹配导致的。

    在提交表单之前应该对用户输入的内容做验证,后台直接做映射了,没有做内容验证的机会。

     

    解决方法:

    上面只是描述了问题产生的原因,而并没有给出解决的方法,很多小伙伴其实看到原因就已经想到解决方法了。

    那有些小伙伴可能刚接触,还搞不清状况,我就再说一下解决的步骤:

    1、改用$.ajax提交数据,添加error回调函数(其实在开发中严格来说是不允许使用$.post的,因为失去了错误处理的功能);

    类似代码如下,具体请参考JQurey参考手册:

    $.ajax({
       type: "POST",
       url: "some.php",
       data: "name=John&location=Boston",
       success: function(msg){
         alert( "Data Saved: " + msg );
       },
        error: function(XMLHttpRequest){
         alert( "Error: " + XMLHttpRequest.responseText);
       }
    });

    这样你就可以通过 XMLHttpRequest.responseText 或XMLHttpRequest.responseHTML 了解到后端代码到底发生了什么错误。

    2、不要把生成实体的工作交给MVC框架来完成

    你的产生问题的代码,我猜测可能类似如下:

    	/** 
    	 * 添加用户.
    	 **/
    	@RequestMapping("/adduser.do")
    	@ResponseBody
    	public void adduser(HttpServletRequest request, HttpServletResponse response, User user) throws Exception {
    		this.userManager.saveOrUpdate(user);
    	}

    这样做就导致上面说过的问题:后台直接做映射了,没有做内容验证的机会;明明一个字段要求数字,结果用户输入了字母或汉字。

    正确的方法类似如下:

    	/** 
    	 * 添加用户.
    	 **/
    	@RequestMapping("/adduser.do")
    	@ResponseBody
    	public void adduser(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		//将形参 user 拿到函数内部定义创建
    		User user = new User();
    		//这里对用户的年龄就要进行判断,具体规则你自己定义,我只是举个例子
    		Integer age = getInteger("age");
    		if (age != null){
    			uset.SetAge(age);
    		}
    		this.userManager.saveOrUpdate(user);
    	}
    	
    	protected Integer getInteger(String name) {
    		String str = this.request.getParameter(name);
    		if (StringUtils.isNotBlank(str)) {
    		  return Integer.valueOf(str);
    		}
    		return null;
    	  }
  • 相关阅读:
    try catch finally语句块中存在return语句时的运行流程
    【Java学习】异常
    【Java学习】面向对象(二)——封装、继承、多态、抽象
    【ASP.NET开发Web项目】vs2019新建ASP.NET空网站,没有出现Default.aspx
    【ASP.NET开发Web项目】VS2019项目模板中没有ASP.NET空网站
    【Java学习】面向对象(一)
    【Java学习】数组的初始化、特点及基础操作(冒泡排序)
    Jmeter接口测试和压力测试的配置和使用
    【Java学习】递归算法之斐波那契数列、100以内的阶乘
    【Java学习】进制转换、二进制原码反码补码和位运算
  • 原文地址:https://www.cnblogs.com/imqsl/p/7678992.html
Copyright © 2020-2023  润新知