我正在尝试使用JAX-RS创建下载服务。为此,我添加了带有文件名的HTTP标头Content-Disposition
。在JAX-RS中,我希望尽可能多地重用,并且我想检测“选定”响应MediaType。 e.g。
@Path("/download")
public class DownloadResource {
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response download() {
return Response.ok(new SomeContent())
// Detect MediaType to decide which file extension has to be used
.addHeader("Content-Disposition", "attachment; filename=\"download.?\"")
.build();
}
}
我希望有Content-Disposition
标头提供xml或json作为下载(仅适用于此示例)。但不知何故,我需要知道首选的MediaType是JAX-RS(在这种情况下是XML或JSON)。
更新:进一步研究后,使用Filter
会更有意义。我更新了这样的代码:
@Path("/download")
public class DownloadResource {
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Attachment
public Response download() {
return Response.ok()
.entity(new SomeContent())
.build();
}
}
我在这里添加了@Attachment
注释。它的定义:
@Retention(RetentionPolicy.RUNTIME)
public @interface Attachment {
}
应添加Content-Disposition
标题的过滤器。
public class AttachmentResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
MediaType responseMediaType = responseContext.getMediaType();
if (responseMediaType instanceof MediaType) {
String fileExtension = ...; // Has to be build
responseContext.getHeaders().add("Content-Disposition",
"attachment; filename=\"" + "file." + fileExtension + "\""
);
}
}
最后添加注册过滤器到FeatureContext
。
@Provider
public class AttachmentFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
Attachment attachment = resourceInfo.getResourceMethod().getAnnotation(Attachment.class);
if (attachment instanceof Attachment) {
context.register(AttachmentResponseFilter.class);
}
}
}
我必须考虑的一件事是如何在AttachmentResponseFilter
中生成自定义文件名,而不是固定的“文件”。串。有什么建议吗?
答案 0 :(得分:0)
我会通过HttpServletRequest
注入@Context
。要确定JAX-RS将选择哪种格式,您需要查看"接受"标题来自request.getHeader("Accept")
。您的浏览器几乎可以使用任何内容。但是REST客户端通常会创建一个标题,例如" Accept:application / json"或类似的东西。
JAX-RS将为您完成这项工作。当您指出时,JAX-RS请求可以为您提供此信息。
我不得不问 - 你为什么关心? JAX-RS的一个要点是向您隐藏它 - 返回您的对象并让其他东西为您序列化。