在服务器端,我有一个如下所示的方法:
@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请求发送到/ foods / 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
正如您所看到的,发送 multipart / mixed (或者也可能是multipart / form-data也很重要)因为我可以设置部件的Content-Type,它会被正确解析。
这一切都有效。现在问题是,我需要使用jQuery(或任何其他Ajax工具)发送此请求,看起来不可能发送multipart / mixed?或者使用iframe有一些技巧,但仍然无法设置部件的内容类型。
有没有人知道这个问题的解决方案?如何在JSON序列化中将对象数组发送到服务器?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
是的,您可以通过JQuery ajax发送multipart / mixed,但必须添加额外的东西:
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);
}
});