2013-06-27 3 views
0

На стороне сервера, у меня есть метод, который выглядит следующим образом:Как отправить запрос JSON, содержащий массив объектов?

@POST 
@Path("/foods/{year}/{month}/{day}") 
@Consumes("multipart/mixed") 
@Produces("application/json; charset=UTF-8") 
@Transactional 
public boolean setFoodsForTheDay(@PathParam("year") int year, @PathParam("month") int month, 
    @PathParam("day") int day, @Multipart(value = "foodList", type = MediaType.APPLICATION_JSON) Food[] foodList) { 

    if (log.isDebugEnabled()) { 
    log.debug("list size={}", foodList.size()); 
    } 
    doStuff(foodList); 

} 

Если я отправляю в запросе следующей POST к/продукты питания/2013/06/26 он действительно будет работать, а массив будет получить разобран правильно:

Host: localhost:7777 
Accept: application/json 
Content-Type: multipart/mixed; boundary=---------------------------25819220131967 
Content-Length: 226 

-----------------------------25819220131967\r\n 
Content-Disposition: form-data; name="foodList"\r\n 
Content-Type: application/json\r\n 
\r\n 
[ {"id":null,"name":"Banana","recipe":null} ]\r\n 
-----------------------------25819220131967--\r\n 

Как вы можете видеть, что это важно, чтобы отправить в многочастному/смешанная (или, возможно, многокомпонентные/форм-данных будет работать тоже), потому что тогда я могу установить Content-Type в части, и он будет правильно разобран.

Все это работает. Теперь проблема в том, что мне нужно отправить этот запрос с помощью jQuery (или любого другого инструмента Ajax), и похоже, что невозможно отправить multipart/mixed? Или есть какой-то трюк с iframe, но до сих пор не удастся установить Content-type детали.

Кто-нибудь знает о решении этой проблемы? Как я могу отправить массив объектов на сервер в сериализации JSON?

ответ

3

Похоже, что это не возможно, с JQuery, но я нашел a blog, который показывает, как сделать это с старый XMLHttpRequest.

Это мой код Javascript, он отлично работает! :)

function sendFoodRequest() { 
    var xhr = new XMLHttpRequest(); 

    xhr.open("POST", 'http://localhost:7777/services/rest/foods/2013/06/25', true); 

    var boundary = '---------------------------'; 
    boundary += Math.floor(Math.random()*32768); 
    boundary += Math.floor(Math.random()*32768); 
    boundary += Math.floor(Math.random()*32768); 
    xhr.setRequestHeader("Content-Type", 'multipart/mixed; boundary=' + boundary); 
    var body = ''; 
    body += '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="foodList"' + '\r\n'; 
    body += "Content-Type: application/json\r\n\r\n"; 
    body += '[ {"id":null,"name":"Spinach","recipe":null} ]'; 
    body += '\r\n' 
    body += '--' + boundary + '--'; 
    xhr.setRequestHeader('Content-length', body.length); 
    xhr.onload = function() { } 
    xhr.send(body); 
} 
0

Да, вы можете отправить многочастному/смешанный через JQuery Ajax, но необходимо добавить дополнительный материал:

cache: false, 
contentType: false, 
processData: false, 


$.ajax({ 
    url: 'php/test.php', 
    data: {name: "test1", age 5}, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'POST', 
    success: function(data){ 
     alert(data); 
    } 
}); 
+0

Это не работает. В Chrome у меня появляется ошибка «Недопустимый тип носителя», а в Firefox - очень длинная ошибка, которая выглядит как «компонент JavaScript не имеет метода с именем:« доступно »при вызове метода ...» Насколько я могу видеть, что была бы ожидаемой ошибкой, если бы я пытался отправить, например, запрос DELETE, и мой браузер не поддерживал это ... однако в этом случае я отправляю только обычный запрос POST. – Csaba