【问题标题】:Receive Image as multipart file to rest service接收图像作为多部分文件以休息服务
【发布时间】:2015-11-09 10:49:37
【问题描述】:

我正在公开一个安静的网络服务,我想在 json 正文请求中接受图像作为多部分文件 我在任何地方都找不到示例 json 请求,以便从休息客户端访问我的休息服务.my rest 服务在类声明上方使用此字段 @Consumes({MediaType.APPLICATION_JSON,MediaType.MULTIPART_FORM_DATA}) 谁能给我一个示例 json 请求

【问题讨论】:

  • @Consumes 子句表示服务接受 application/json 或 multipart/form-data。如果客户端要发送图像,它将选择 multipart/form-data 并且不会发送 json 请求。所以我认为你应该寻找一个 multipart/form-data 请求而不是一个 json 请求。
  • 有什么方法可以让我在休息服务类的同一方法中同时接受 json 请求和多部分请求?我应该编写单独的方法来获取图像
  • here

标签: java json rest resteasy rest-client


【解决方案1】:

multipart/form-data 的目的是在一个请求中发送多个部分。这些部件可以有不同的媒体类型。所以你不应该混合json和图像而是添加两个部分:

POST /some-resource HTTP/1.1
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="json"
Content-Type: application/json

{ "foo": "bar" }

--AaB03x--
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: application/octet-stream

... content of image.jpg ...

--AaB03x--

使用 RESTeasy 客户端框架,您可以像这样创建这个请求:

WebTarget target = ClientBuilder.newClient().target("some/url");
MultipartFormDataOutput formData = new MultipartFormDataOutput();
Map<String, Object> json = new HashMap<>();
json.put("foo", "bar");
formData.addFormData("json", json, MediaType.APPLICATION_JSON_TYPE);
FileInputStream fis = new FileInputStream(new File("/path/to/image"));
formData.addFormData("image", fis, MediaType.APPLICATION_OCTET_STREAM_TYPE);
Entity<MultipartFormDataOutput> entity = Entity.entity(formData, MediaType.MULTIPART_FORM_DATA);
Response response = target.request().post(entity);

可以这样消费:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response upload(MultipartFormDataInput input) throws Exception {
    Map<String, Object> json = input.getFormDataPart("json", new GenericType<Map<String, Object>>() {});
    InputStream image = input.getFormDataPart("image", new GenericType<InputStream>() {});
    return Response.ok().build();
}

【讨论】:

  • 感谢您的帮助..而不是这个上传(MultipartFormDataInput 输入),我想将请求映射到一个pojo..像这个上传(Mrequest mrequest)..这可能吗?我还复制了用于创建请求的代码(上图)。MultipartFormDataOutput 不可用..你可以给我发送一个请求,以便我可以从 google chrome 的 rest 客户端插件触发请求
  • 您可以使用 @MultipartForm,正如 peeskillet 已评论的那样。 MultipartFormDataOutput 包含在org.jboss.resteasy:resteasy-multipart-provider
  • 嗨@lefloh,我通过使用 ResteasyClient client = new ResteasyClientBuilder().build(); 更改了 webrequest 形成部分;而不是 WebTarget target = ClientBuilder.newClient().target("some/url");我可以打其余的服务。 FileInputStream fis = new FileInputStream(new File("/root/Downloads/index.jpeg"));在这个位置实际上有一个真实的jpeg图像。但是在rest service InputStream image = input.getFormDataPart("image" , 新的 GenericType() {});我收到空指针异常...:(
  • 异常是“无法找到媒体类型的 MessageBodyReader:application/octet-stream 和类类型 org.jboss.resteasy.util.Base64$InputStream”
  • 我认为您的资源类中有错误的导入。使用java.io.InputStream 而不是org.jboss.resteasy.util.Base64.InputStream
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 2020-01-21
  • 2016-06-30
  • 2012-04-02
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多