诡异的JSON数据传递错误

问题描述:
        昨天写数据接口的时候,忽然发现这样一个问题:

  1. 后台Java可以获得前台传来的参数
  2. 后台可根据前台传入的参数进行数据查询,并顺利打印查询结果在Java控制台
  3. 将接口URL拷贝至浏览器地址栏,可获得 HttpServletResponse 打印的数据
  4. 浏览器控制台 Network 可看到请求的 Status Code 为 200,响应结果与后台Java控制台相同
  5. jQuery ajax 中 error:function(){} 被执行

代码
Java code:

import java.io.IOException;  
import org.apache.struts2.ServletActionContext;  
import com.opensymphony.xwork2.ActionSupport;  
public class TestAction extends ActionSupport {
private static final long serialVersionUID = 8597954698686874293L;

	public String test(){
		System.out.println(ServletActionContext.getRequest().getParameter("test"));
		StringBuffer sb = new StringBuffer();
		sb.append("aaa,");
		sb.append("bbb");
		System.out.println(sb);
		try {
			ServletActionContext.getResponse().getWriter().print(sb);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return NONE;
	}
}  

ajax code:

$(".ajaxTest").click(function(){
	$.ajax({
		url:"test",
		type:"post",
		dataType:"JSON",
		data:{
				test:"test"
			},
		async:true,
		success:function(data){
			console.log(data);
		},
		error:function() {
			console.log("error");				
        }
	})
})  

当 class=“ajaxTest” 这个按钮被点击后
Java控制台输出:

test
aaa,bbb  

浏览器控制台输出:

error  

修改思路:

  1. 修改 error 函数,function中传入XMLHttpRequest, textStatus, errorThrown 这三个参数,并在函数中进行打印

    console.log(XMLHttpRequest.status);
    console.log(XMLHttpRequest.readyState);
    console.log(textStatus);

此时再点击页面上的按钮时,浏览器控制台会打印出一下信息:

200  
4  
parsererror  

由此可知是类型转换错误。

2.修改 ajax 中 dataType 属性值为 text。再次点击按钮,此时浏览器控制台输出正确结果:

aaa,bbb  

正确 ajax code:

$(".ajaxTest").click(function(){
	$.ajax({
		url:"test",
		type:"post",
		dataType:"text",
		data:{
				test:"test"
			},
		async:true,
		success:function(data){
			console.log(data);
		},
		error:function(XMLHttpRequest, textStatus, errorThrown) {
			console.log(XMLHttpRequest.status);  
			console.log(XMLHttpRequest.readyState);  
			console.log(textStatus);				
        }
	})
})  

注意:

ajax 中 dataType 为可缺省值,在使用ajax的时候,如果指定了dataType,会根据 dataType 指定的类型去解析返回的数据;如果没有指定dataType 会去检查 MIME 的值。在指定 dataType 或使用 response.setContentType(MIME)) 指定 MIME 值时,注意与返回的数据类型一致。如果返回的数据是一个纯文本字符串,但 dataType 设置为 “json” 或者是 MIME 值设置为 “text/json”,那么ajax会报错,直接走到 error 里面去,虽然数据是返回到了页面,但读不出来。如果返回数据是 json,却设置为 text,那么返回的只是一个纯文本。

总结:

  1. 要有写 dataType 属性,并指明返回值类型的习惯
  2. 要有写 error 属性的习惯
  3. error 属性函数中,可以通过添加 XMLHttpRequest, textStatus, errorThrown 参数来更好的定位问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值