通过Ajax进行POST提交JSON类型的数据到SpringMVC Controller的方法

原创
2015/10/10 09:32
阅读数 3.9W

现在在做的项目用到了SpringMVC框架,需要从APP接收请求的JSON数据,为了测试方便,所以直接先用AJAX进行测试,不过刚开始用平时用的ajax方法,提交请求会出现415或者400错误,经过研究,终于可以了,现在做个总结。

js代码:

function postSimpleData() {
        $.ajax({
            type: "POST",
            url: "Service/SimpleData",
            contentType: "application/json", //必须有
            dataType: "json", //表示返回值类型,不必须
            data: JSON.stringify({ 'foo': 'foovalue', 'bar': 'barvalue' }),  //相当于 //data: "{'str1':'foovalue', 'str2':'barvalue'}",
            success: function (jsonResult) {
                alert(jsonResult);
            }
        });
    }
    function login(){
	$.ajax({
	    url: "Service/login",
	    type: "POST",
	    contentType: "application/json",
	    dataType: "json",
	    data: JSON.stringify({
	    	MachineIP:"127.0.0.1",
	    	AppTag:"4",
	    	RequestInfo:{
	    		StaffCode:"",
	    		Password:"",
	    		StaffCard:"01411"
	    	},
	    }),
	    async: true,
	    success: function(data) {
	    	var ss = JSON.stringify(data);
	    	$("#result").val(ss);
	        console.log(ss);
	    }
	});
    }
    function postEmployees() {
        $.ajax({
            type: "POST",
            url: "Service/Employees",
            contentType: "application/json",
            dataType: "json",
            data: JSON.stringify({                "Employees": [
                                    { "firstName": "Bill", "lastName": "Gates" },
                                    { "firstName": "George", "lastName": "Bush" },
                                    { "firstName": "Thomas", "lastName": "Carter" }
                                 ]

            }),
            success: function (jsonResult) {
                alert(jsonResult);
            }
        });
    }

JAVA Controller代码:

@RequestMapping(value = "/SimpleData",method=RequestMethod.POST)
@ResponseBody
public ActionResult SimpleData(string foo, string bar){            
    return Json("SimpleData", JsonRequestBehavior.AllowGet);
}

@RequestMapping(value = "/login",method=RequestMethod.POST)
@ResponseBody
public ResponseProtocolMap login(@RequestBody JSONObject requestJson,
		HttpServletRequest request) {
    ResponseProtocolMap responseProtocolMap = null;
    String machineIP = RequestJsonUtils.getMachineIP(requestJson);
    String appTag = RequestJsonUtils.getAppTag(requestJson);
    JSONObject requestInfo = RequestJsonUtils.getRequestInfo(requestJson);
    if (requestInfo == null) {
        responseProtocolMap = new ResponseProtocolMap("-1","参数错误");
    } else {
        String staffCode = RequestJsonUtils.getValueByKey(requestInfo, "StaffCode");
        String password = RequestJsonUtils.getValueByKey(requestInfo, "Password");
        String staffCard = RequestJsonUtils.getValueByKey(requestInfo, "StaffCard");
        responseProtocolMap = sysLoginService.login(staffCode, password,staffCard, appTag, request);
    }
    return responseProtocolMap;
}
@RequestMapping(value = "/Employees",method=RequestMethod.POST)
@ResponseBody
public ActionResult Employees(List<Employee> Employees){
    return Json("Employees", JsonRequestBehavior.AllowGet);
}
public class Employee{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

值得注意的有2点:

1)Ajax 选项中

 contentType: "application/json"

 这一条必须写,表明request的数据类型是json。

dataType: "json"

这一条表示返回值的类型,不是必须的,且依据返回值类型而定。

2)选项中

data: JSON.stringify({ 'foo': 'foovalue', 'bar': 'barvalue' })

 很多时候我们将数据写作:

{ 'foo': 'foovalue', 'bar': 'barvalue' }

这样会导致错误,因为js会默认将这个json对象放到表单数据中,故而导致controller接收不到。

有两种办法处理:第一种方式是用JSON.stringify()函数,其中JSON被Ecmascript5定义为全局对象。

第二种方式是直接用双引号包裹起来,比如data: "{'str1':'foovalue', 'str2':'barvalue'}"。


展开阅读全文
打赏
4
87 收藏
分享
加载中
你好,我还是有一些地方不懂,能不能给个联系方式向你请教一下?
2017/02/28 15:39
回复
举报
其实没有说到重点,这种模式就是: Request Payload 模式,是区别于post, get 的另外一种请求方式,其后台接收参数的方式也不是常规的request.getParameter()了。
2015/10/27 09:15
回复
举报
zchuanzhao博主

引用来自“小杨阿哥哥”的评论

你第二个:
JSON.stringify({ "BuIds": ["1", "2", "3"] }),

这个上去到public ActionResult ListString(List<string> buIds)
能取到?

不是需要给变量加@RequestBody 注解么?才会将json字符串解析然后放到给了这个注解的变量吗
发现Spring不能直接注入List类型的,之前没有注意到
2015/10/12 12:30
回复
举报
你第二个:
JSON.stringify({ "BuIds": ["1", "2", "3"] }),

这个上去到public ActionResult ListString(List<string> buIds)
能取到?

不是需要给变量加@RequestBody 注解么?才会将json字符串解析然后放到给了这个注解的变量吗
2015/10/12 01:00
回复
举报
更多评论
打赏
4 评论
87 收藏
4
分享
在线直播报名
返回顶部
顶部