2012-04-05 3 views
5

У меня есть простой вызов jquery ajax в службу отдыха. Я устанавливаю contentType как «application/json», а остальные ресурсы настроены на принятие «MediaType.APPLICATION_JSON». Это метод POST. С этой настройкой, я получаю "Неподдерживаемый тип носителя".jquery ajax rest call - Неподдерживаемый тип мультимедиа

Информационный заголовок показывает «Content-Type приложения/JSON, кодировка = UTF-8» в заголовке запроса

отклика показывает: Отчет о состоянии: неподдерживаемый тип носителя Сервер отказал этот запрос потому что объект запроса находится в формате, не поддерживаемом запрошенным ресурсом для запрошенного метода (Unsupported Media Type).

Просьба указать некоторые рекомендации для решения этой проблемы.

Вот фрагмент кода:

Rest Ресурс

@POST 
@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
@Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
public Response addPerson(MyJSONObj myObj) { 
    //... 
    // ... 
    //... 
} 

JQuery

$(document).ready(function() { /* put your stuff here */ 
    $("#Button_save").click(function(){ 
    var firstName = $('firstName').val(); 
    var lastName = $('lastName').val(); 
    var person = {firstName: firstName, lastName: lastName}; 
    $.ajax({ 

     url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
     type: 'POST', 
     data: person, 
     Accept : "application/json", 
     contentType: "application/json", 

     success:function(res){ 
     alert("it works!"); 
     }, 
     error:function(res){ 
      alert("Bad thing happend! " + res.statusText); 
     } 
    }); 
    }); 
}); 

Заголовки, как показано в FF Firebug

Response Headers

Content-Length 1117 
Content-Type text/html;charset=utf-8 
Date Thu, 05 Apr 2012 09:44:45 GMT 
Server Apache-Coyote/1.1 

заголовков запроса

Accept */* 
Accept-Encoding gzip, deflate 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Content-Length 97 
Content-Type application/json; charset=UTF-8 
Host localhost:8080 
Referer http://localhost:8080/sampleApplication/ 
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0 
X-Requested-With XMLHttpRequest 

ответ

0

Похоже, что вы можете страдать от дырявой абстракции. См. Этот ответ: JQuery's getJSON() not setting Accept header correctly?

Если вы выполняете междоменный вызов, то, похоже, вы не можете установить заголовок accept из-за того, как jQuery абстрагирует вызов от вас.

Однако вы говорите, что сервер видит правильный заголовок принятия. Это может указывать на другую проблему.

2

я была такая же проблема, и я был в состоянии решить, что путь (см http://www.weverwijk.net/wordpress/tag/jquery/):

$.ajax({ 
    url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
    type:'POST', 
    data: JSON.stringify(person), 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    success:function(res){ 
     alert("it works!"); 
    }, 
    error:function(res){ 
     alert("Bad thing happend! " + res.statusText); 
    } 
}); 

На Java стороне я добавил эти (см Access-Control-Allow-Origin):

@OPTIONS 
public Response testt(@Context HttpServletResponse serverResponse) { 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 
    return Response.ok().build(); 
} 

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj, @Context HttpServletResponse serverResponse) 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 

    // ... 
    // ... 
} 

Заключение

  • Объект JSON передается и t ransformed автомагически (подробнее см Configuring JSON for RESTful Web Services)
  • POST фиксации
  • Междоменное (Same-Origin-политика)
  • Firefox работает (см @option тег)
+0

Протестировано @Options, и оно, похоже, не работает, также должен быть указан заголовок в ответе –

+0

, можете ли вы предоставить дополнительную информацию о том, какая ошибка возникает? Потому что я использую этот код во всех моих проектах. –

1

Я думаю, что оригинальный пост работал бы что код сделал две дополнительные вещи:

установить данные к JSON.serialize (человек) и установить DATATYPE в «JSON», так как CONTENTTYPE было правильно, это должно работать с @PUT ожидая, чтобы потреблять ... JSON

0

TRY ЭТО ПЕРВОЕ Преобразование данных в формате JSON, как @ wnm3 предложил.

ЕСЛИ ЕЩЕ ПЕРЕД ПРОБЛЕМА ПРОДОЛЖИТЬ -

Это помогло мне, если ваш синтаксис запроса является правильным. Это вещь, которую я сделал, который удалить 415 неподдерживаемых ошибку -

@PUT 
//REMOVE THIS LINE !!!!!! ----- @Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 

    // 
    //Your code here 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

Я точно не знаю, как сделать CORS запрос, который будет отправлять и принимать заявки/JSON. Ответ, данный @Tobias Sarnow, частично неверен. Поскольку вам не нужен метод, который принимает запрос OPTIONS. Даже если браузер показывает, что он отправляет запрос OPTIONS, он все равно будет искать метод с аннотацией @POST. Поэтому вместо того, чтобы помещать фильтр или делать что-то еще (более изысканные способы), я сделал это быстро, используя другой метод без @Consumes и @Produces. ПРИМЕР-

@PUT 
public Response addPerson() { 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

@PUT 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 
    // 
    //Your code here 
    // 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

Так что здесь происходит как начальные CORS для OPTIONS обрабатывается первым способом, то второй метод обрабатывает запрос на оригинал PUT.

Я помещаю этот ответ здесь, поскольку мне потребовалось 3-4 дня, чтобы выяснить, почему мой запрос PUT не прошел. Таким образом, это может помочь кому-то, кто имеет ошибку 415.

Смежные вопросы