Jersey/Jquery HTTP通信和JSON数据

Jersey/Jquery HTTP通信和JSON数据,jquery,json,http,post,jersey,Jquery,Json,Http,Post,Jersey,我在让Jersey和Jquery以JSON格式通信数据时遇到了一些问题。 在下面的最小示例中,始终将HTTP 204返回给调用JQuery客户端 @Path("/path") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class Resource { @POST public ReturnData postSomething(@Valid Data data

我在让Jersey和Jquery以JSON格式通信数据时遇到了一些问题。 在下面的最小示例中,始终将HTTP 204返回给调用JQuery客户端

@Path("/path")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {
    @POST
    public ReturnData postSomething(@Valid Data data) {
      Log("success");
      ...
      ReturnData returnData = ...;
      return returnData;
    }
}
我使用以下JQuery代码,每次发布后都会调用error函数

$.ajax({
     type: "POST",
     contentType: "application/json; charset=utf-8",
     url: url,
     data: '{"data": "data"}',
     dataType: "json",
     error: function(data){
          alert("fail");
     },
     success: function(data){
          alert("success");
     }
     });
在Firebug中,我看到了以下HTTP请求/响应以及上述设置:

OPTIONS /path HTTP/1.1
Host: 192.168.15.109:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 204 No Content
Date: Thu, 24 May 2012 16:10:57 GMT
Allow: OPTIONS,POST
起初,我在JQuery帖子中尝试了一个没有contentType的设置:“application/json;charset=utf-8”,结果如下:

POST /path HTTP/1.1
Host: 192.168.15.109:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/test.html
Content-Length: 104
Origin: http://localhost
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 415 Unsupported Media Type
Date: Thu, 24 May 2012 16:08:55 GMT
Content-Type: text/plain;charset=UTF-8
Cache-Control: must-revalidate,no-cache,no-store
Content-Length: 72
Cache-Control: no-cache
我认为客户机和服务器由于某种原因找不到他们都同意的数据类型。我觉得奇怪的是,在将contentType设置为JSON时,accept头不包含JSON

日志(“成功”);在服务器端,永远不会执行


有人能给我指出正确的方向吗?

数据类型参数指的是从服务器返回的数据,而不是正在提交的数据。我认为您假设它正在发送原始json,而事实上它正在评估您传递的数据,并使用jQuery.param()将其转换为字符串,您可以在
$\u请求中使用该数据。看

根据文档,您发送的数据应为以下格式的键值字符串:

key1=value1&key2=value2
{key1: 'value1', key2: 'value2'}
或在使用此格式的地图中:

key1=value1&key2=value2
{key1: 'value1', key2: 'value2'}

也许你额外的引语让这张地图失去了意义?我个人总是使用键值字符串,因为它似乎没有那么奇怪。

谢谢!实际上,我希望服务器返回JSON。我遵循了下面的教程,在那里他们还发送一个普通的json字符串作为数据,而不是键/值字符串或映射格式。顺便说一句:ApacheHttpClient测试可以在没有问题的情况下发送到服务器并从服务器接收json这也是我的问题。我花了几个小时尝试每一个可用的建议,但我无法让它发挥作用。ajax似乎无法像Jersey所期望的那样将其数据转换为JSON对象。