RESTEasy:无法使用内容类型 - 即使使用正确的@Consumes

时间:2014-11-24 21:15:29

标签: java rest resteasy

我正在开发一个接受密钥和数据(值)的REST资源......我想要健壮,所以这些数据可以是任何东西。它可以是从字符串到文件。

为了解决这个问题,我的PUT REST方法就在帖子的最后。没有什么好看的,只是试图PUT基本数据。如果我发送的数据是一个字符串,那就没问题了。

但是,如果我尝试发送文件,则会收到此错误:org.jboss.resteasy.spi.UnsupportedMediaTypeException: Cannot consume content type。这就是为什么这对我没有意义:

如果我将@Consumesapplication/octet-stream更改为@Consumes("multipart/form-data"),我可以直接发送文件。在检查存储的文件时,我看到如下内容:

------WebKitFormBoundaryfuQalizBHtg1BiLJ
Content-Disposition: form-data; name="fileUpload1"; filename="uploadedFile.extension"
Content-Type: application/octet-stream

/* file information here */
------WebKitFormBoundaryfuQalizBHtg1BiLJ--

请注意,Content-Type应该是application/octet-stream,这是我之前尝试过的,但得到了Cannot consume content type例外。我不知道是什么原因引起的。我正在使用Chrome的Advanced Rest Client扩展程序发送我的请求,它看起来像这样:https://i.imgur.com/KvKCIkl.jpg

有什么想法?谢谢!

@PUT
@Path("{key}")
@Consumes("application/octet-stream")
public Response addData(
    final @PathParam("key") String key,
    final InputStream data) {
  final Service service =  new Service();
  try {
    service.addData(key, data);
  } finally {
    IOUtils.closeQuietly(data
  }
  return Response.status(204).build();
}

1 个答案:

答案 0 :(得分:0)

multipart/form-data消息包含一系列由边界划分的部分。每个部分都有自己的Content-Type。因此,在您的示例中,Content-Type: application/octet-stream是一个(可能是唯一的)部分的Content-Type,但整个邮件的Content-Type是multipart/form-data。包含多个部分的完整邮件可能如下所示:

Content-Type: multipart/form-data; boundary=WebKitFormBoundaryfuQalizBHtg1BiLJ

------WebKitFormBoundaryfuQalizBHtg1BiLJ
Content-Disposition: form-data; name="fileUpload1"; filename="uploadedFile.extension"
Content-Type: application/octet-stream

/* file information here */
------WebKitFormBoundaryfuQalizBHtg1BiLJ--

------WebKitFormBoundaryfuQalizBHtg1BiLJ
Content-Type: text/plain 

/* some text here */
------WebKitFormBoundaryfuQalizBHtg1BiLJ--