【问题标题】:Combine multiple Response into one Response将多个响应合并为一个响应
【发布时间】:2016-11-30 12:36:08
【问题描述】:

我有以下下载内容为 c50c4a23307529b59797525c52b2c50c *file1.zip 的文件

现在我想将 file1Response 和 file2Response 合并为 json。有什么帮助吗?

@GET
@Path("/" + getfileschecksum)   
@Produces("application/json") 
public Response getFilesChecksum() {
        String fileid1 = "file1";
        String fileid2 = "file2";


        Response file1Response = getChecksum(fileid1);
        Response file2Response = getChecksum(fileid2);

        return file1Response;


    }

尝试如下添加数组列表:

@GET
    @Path("/" + getfileschecksum)   
    @Produces("application/json") 
    public Response getFilesChecksum() {
            String fileid1 = "file1";
            String fileid2 = "file2";

            ArrayList<Response> rp = new ArrayList<Response>();

            Response file1Response = getChecksum(fileid1);
            Response file2Response = getChecksum(fileid2);

            rp.add(file1Response);
            rp.add(file2Response);
            return Response.ok(rp).build();


        }

返回错误 com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/json was not found .

file1Response 来自下面,可以在下面更改任何内容以返回字符串。

            URL url = new URL(binpath);
            URLConnection connection = url.openConnection();
            InputStream is = connection.getInputStream();
            String mt = connection.getContentType();
            ResponseBuilder response = Response.ok((Object) is, mt);
            response.header("Content-Disposition","attachment; filename=" + binpath.substring(binpath.lastIndexOf('/') + 1, binpath.length()));
            return response.build();

【问题讨论】:

  • 我假设 Response 是 javax.ws.rs.core.Response 对象。首先这不起作用,因为它是一个接口,您必须向它添加 @JsonTypeInfo 以告诉序列化程序如何序列化它。您需要将 ArrayList 转换为 ArrayList 并将实际的字符串值放在那里而不是 Response 对象。
  • 我尝试了 file1Response.getEntity().toString(),但这会返回 weblogic.net.http.KeepAliveStream@458324f2 而不是实际内容。如何从响应中获取字符串?

标签: java jaxb jersey jersey-2.0 jaxb2


【解决方案1】:

试试:

StringBuffer response = new StringBuffer();
response.append(file1Response );
response.append(file2Response );

return response.toString();

如果它不起作用没有伤害,只是试图提供帮助。 但如果它确实竖起大拇指。

【讨论】:

  • 无效且未从 file1Response 返回内容。
【解决方案2】:

我建议您创建另一个实际返回字符串校验和的方法,然后让您的资源方法调用它。

@GET
@Path("{file}/checksum")
Response getChecksum(@PathParam("file") final String file) {
    return Response.ok(calculateChecksum(file)).build();
}


@POST
@Path("checksums")
Response getChecksum(final List<String> toChecksum) {
    final List<String> checksums = new ArrayList<>();
    for (String s : toChecksum) {
       checksums.add(calculateCheckSum(s));
    }
    return Response.ok(checksums).build();
}



private String calculateCheckSum(final String file) {
    // do your checksum
}

【讨论】:

  • URL url = 新 URL(binpath); URLConnection 连接 = url.openConnection(); InputStream is = connection.getInputStream();字符串 mt = connection.getContentType(); ResponseBuilder response = Response.ok((Object) is, mt); response.header("Content-Disposition","attachment; filename=" + binpath.substring(binpath.lastIndexOf('/') + 1, binpath.length()));返回 response.build();这就是返回 file1Response 的内容,需要将其提取到字符串中。
  • 我完全误读了这个问题。您不能将二进制文件作为 json 返回,这是不可能的。如果您尝试在单个请求中返回两个文件二进制文件,据我所知,这也是不可能的。即使您可以,该文件也会显示为一个文件,并且似乎已损坏。如果您需要下载多个文件,则需要在发送单个存档文件之前在服务器端将它们存档为单个 zip、tar、rar 等。在您的情况下,它看起来像是一个拉链。
  • 文件只有文本内容。是否可以读取java中的内容。或者有没有办法使用 ResponseBuilder 从文件中更改对 String 的响应。
  • 文件下载通常是 base64 编码的文本。所以你可以得到文本。我猜你可以对文件进行base64编码并将其作为文本发回。但浏览器不会提示您下载文件,除非 Content-Disposition 设置为附件。
  • 返回文件的编码是ANSI,我只需要获取内容并将其作为String或JSON返回,它不需要是另一个文件。有关如何执行此操作的任何帮助?
猜你喜欢
  • 1970-01-01
  • 2018-02-26
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2022-08-23
  • 2020-11-04
  • 1970-01-01
相关资源
最近更新 更多