基于 Java-Jersey 的 RESTful 网络服务 : What is the best way to handle path param for a file entity

标签 java web-services rest jersey

我正在使用 jersey 编写基于 Java 的 REST 网络服务。我为其编写 Web 服务的实体是一个媒体文件。请求媒体文件的客户端需要将路径和文件名作为路径参数发送。允许的媒体路径最多可达五个目录的深度。现在的挑战是编写一个方法来处理所有路径深度的可能性。就业务场景而言,使用路径参数是唯一允许的选择。这是处理媒体文件请求的方法契约:

public Response getMediaFile(@PathParam("path") String path,
                        @PathParam("filename") String filename);

此方法的问题在于,如果请求类似于/media/filedir1/filedir2/filename,则无法正确获取文件名。

我已经实现的解决方案是,我已经重载了这个方法来处理所有目录深度,但我并不真的相信这是最好的解决方案:

public Response getMediaFile(@PathParam("path1") String path1, 
                        @PathParam("path2") String path2, 
                        @PathParam("filename") String filename);

public Response getMediaFile(@PathParam("path1") String path1, 
                                @PathParam("path2") String path2, 
                                @PathParam("path3") String path3,
                                @PathParam("filename") String filename);

等等。

最佳答案

您应该能够在您的@PathParam 注释中使用正则表达式来处理所有路径过滤逻辑。例如,这将为您提供最多向下 5 个目录的文件路径:

@Path("{path:(?:[^/]+/){0,4}[^/]+}")

然后您将该值注入(inject)预期的方法中:

@Path("{path:(?:[^/]+/){0,4}[^/]+}")
/* Other attributes too... */
public Response getMediaFile(@PathParam("path") String path) {
    File file=new File(MEDIA_HOME_DIR, path);
    if(file.exists()) {
        // Process file
    }
    else {
        // No such file
    }
}

正则表达式将处理“五个目录”的限制,如果将来数量从五个改变,将很容易修复。如果您只需要匹配 .jpg 文件(例如),您也可以轻松地更仔细地过滤文件名。

解决了这个问题后,您只需要为媒体服务即可。 :)

关于基于 Java-Jersey 的 RESTful 网络服务 : What is the best way to handle path param for a file entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870566/

相关文章:

java - 短暂不活动后,Openshift 服务不可用

java - android 上的一个 Activity 是否可以有多个 java 类?

php - 数据同步如何工作以及如何在服务器-客户端应用程序中使用它?

java - 如何处理 RESTful Web 服务中的聚合和组合

rest - 使用 REST API 更改数组/集合顺序

java - JBoss 6.1.0 AS 过滤器在 web.xml 中的位置

java - 如何在 Windows 的命令行中运行这个 java 类?

java - 使用 Android 在 AWS IoT 服务上发布 MQTT 消息

ios - 转换wsdl2objc后如何在swift中使用soap服务

jquery - jquery ajax跨域请求