我想将JSON数据发送到控制器的POST处理程序。我在客户端这样做:
var userName = $('#userName').val();
var password = $('#password').val();
var mail = $('#mail').val();
var admin =$("#admin").is(':checked');
var user = {userName: userName, password: password, mail: mail, admin:admin};
$.ajax({
async : false,
type:'POST',
url: '/uxiy/webapp/uxmer',
data: user,
dataType: 'json',
success: function(data) {
...
},
error: function(data) {
...
}
});
我的Spring控制器如下:
@RequestMapping(method = RequestMethod.POST)
public void createUser(HttpServletResponse response, @RequestBody User user) {
user.setName("POST worked");
//todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
response.setStatus(HttpServletResponse.SC_OK);
}
然而,当我发送数据时,我在Firebug上收到了错误:
“NetworkError:415不支持的媒体类型”
有什么问题?
PS: Firebug POST详细信息的一个示例:
Parameters application/x-www-form-urlencoded
admin true
mail user@user.com
password r
userName userx
Source
userName=userx&password=r&mail=user%40user.com&admin=true
PS2: 我添加后
contentType: 'application/json',
它开始提供
"NetworkError: 400 Bad Request"
可能是什么问题,进行序列化等?
PS3: 在这里:http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/它说:
如果存在验证错误,则返回HTTP 400 错误消息,否则返回HTTP 200。
我有400个错误请求错误。也许问题与此有关?
答案 0 :(得分:4)
问题是关于JSON数组。它不是从客户端发送到服务器的有效JSON字符串。
<小时/> 的修改
为了澄清这一点,我偶然发现了这篇文章。需要在Ajax请求中执行适当的JSON.stringify(data)
。这很奇怪,但在设置相应的.ajax
时,dataType
函数并没有这样做。
$.ajax({
async : false,
type:'POST',
url: '/uxiy/webapp/uxmer',
data: JSON.stringify(user),
dataType: 'json',
success: function(data) {
...
},
error: function(data) {
...
}
});
答案 1 :(得分:1)
将内容类型设置为application/json
,否则杰克逊将无法启动。
$.ajax({
async : false,
type:'POST',
contentType: 'application/json',
url: '/uxiy/webapp/uxmer',
data: user,
dataType: 'json',
success: function(data) {
...
},
error: function(data) {
...
}
});
答案 2 :(得分:0)
您需要设置控制器接受的媒体类型。
文档:
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html
查看ContentNegotiatingViewResolver
Accept:标题主要是您需要关注的内容。