我正在使用 JAX-RS 开发 RESTful API。我的 API 的简化版本如下:
GET /appapi/v1.0/users
POST /appapi/v1.1/users
... ... and so on
如您所见,模式如下{api_name}/v{major_version}.{minor_version}/{rest_of_the_path}
。
我有一个额外的要求:
如果未指定版本,则默认使用最新版本- 即,
GET /appapi/users
应该相当于GET /appapi/v1.1/users
(假设1.1是最新版本的用户)。
这就是我使用 JAX RS 实现它的方式。
@Path("/appapi")
public class AppApiRootResource {
@Path("/{version: [v]\\d+[[.]\\d+]?}/")
public AppApiSubResource getVersionedSubResource
(@PathParam("version") String version){
System.out.println("Version: "+version);
String versionString = version.substring(1); //Discard the leading 'v'
String majorVersion = "";
String minorVersion = "0";
if(versionString.contains(".")){
String [] splits = versionString.split(".");
majorVersion = splits[0];
minorVersion = splits[1];
} else {
majorVersion = versionString;
}
return SubResourceFactory.getSubResource(majorVersion, minorVersion);
}
@Path("/{^([v]\\d+[[.]\\d+]?)}/") //Is This Correct??
public AppApiSubResource getDefaultApiResource(){
/*
* Need help defining the regular expression here
* so that this is used for anything that doesn't match
* the "version" regexp above
*/
System.out.println("API version not specified; Using default version");
return SubResourceFactory.getLatestVersionSubResource();
}
}
我的子资源类定义如下。我有这个类的子类来处理 API 的多个版本。的实施与SubResourceFactory
本讨论的目的无关。它只返回一个实例AppApiSubResource
或其子类
public class AppApiSubResource {
/**
* Create a new user
*/
@POST
@Path("users")
@Consumes(MediaType.APPLICATION_XML)
public Response createUser(String newUser, @Context UriInfo uriInfo) {
URI uri = uriInfo.getAbsolutePathBuilder().path("10")).build();
return Response.created(uri).build();
}
/**
* Get a user
*/
@GET
@Path("users/{id}")
@Produces(MediaType.APPLICATION_XML)
public Response getUser(@PathParam("id") String userId
) {
return Response.ok().entity("<user></user>").build();
}
}
问题陈述:
- 如果我注释掉
getDefaultApiResource()
,那么当 API 中有版本说明符时,事情会按预期工作。但是,如果我取消注释getDefaultApiResource()
,它总是被调用,无论我是否在请求中有 v1.0。- 此外,如果我取消注释
getDefaultApiResource()
,我会在执行 a 时得到 404GET /appapi/users
(即,没有版本说明符);但如果我使用GET /appapi/v1.0/users
(即,使用版本说明符),一切正常
那么,如何设置我的子资源定位器路径/正则表达式,以便在请求中没有版本说明符时调用该方法?
我正在使用 Restlet 框架,但这个问题与实现无关。