2013-06-27 64 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 

正如你所看到的,在發送重要的一個多/混合(或者多/表單數據將工作太),因爲這樣我可以設置部分的內容類型,它會被正確解析。

這一切正常。現在的問題是,我需要使用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的阿賈克斯,但必須添加額外的東西:

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

相關問題