У меня возникли проблемы с тем, чтобы Джерси и Jquery обменивались данными в формате JSON. В следующем минимальном примере вызывающему клиенту JQuery всегда возвращается HTTP 204.
@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, и функция ошибки вызывается после каждого сообщения.
$.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
Сначала я попробовал установку без contentType: «application/json; charset=utf-8» в сообщении JQuery, которое получилось следующим образом:
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
Я думаю, что клиент и сервер по какой-то причине не могут найти тип данных, с которым они оба согласны. Мне кажется странным, что заголовок accept не включает JSON при установке для contentType значения JSON.
Журнал("Успех"); на стороне сервера никогда не выполняется.
Может ли кто-нибудь указать мне правильное направление?