0

在服务器端,我有一个如下所示的方法:

@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);

}

如果我向 /foods/2013/06/26 发送以下 POST 请求,它将实际工作并且数组将被正确解析:

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 有一些技巧,但仍然无法设置部件的Content-type

有谁知道这个问题的解决方案?如何在 JSON 序列化中将对象数组发送到服务器?

4

2 回答 2

3

看起来这不可能使用 jQuery,但是我确实找到了一个博客,它展示了如何使用旧的 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);
}
于 2013-06-27T21:36:02.873 回答
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);
    }
});
于 2013-06-27T20:54:33.533 回答