将JSON数据发送到服务器错误

时间:2011-09-20 06:36:32

标签: jquery json spring rest spring-mvc

我想将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个错误请求错误。也许问题与此有关?

3 个答案:

答案 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:标题主要是您需要关注的内容。