我有两个REST网址,如:
http://myschool/student/jack //get student information.
http://myschool/student/jack?books //get student books.
代码:
@Path("student")
public class StudentResource {
@GET
@Path("{name}")
public Response getInformation(@PathParam("name") String name) {
return Response.ok(loadStudentInformation(name));
}
@GET
@Path("{name}?books") //ineffective expression
public Response getBooks(@PathParam("name") String name) {
return Response.ok(loadStudentBooks(name));
}
泽西岛不能处理第二个网址'http:// myschool / student / jack?books',它总是以第一种方法'getInformation'发送以'?books'结尾的传入请求。
我尝试使用这样的正则表达式:
@GET
@Path("{name : .*(\\?books$)}") //ineffective expression
public Response getBooks(@PathParam("name") String studentName) {
正则表达式也是无效的,有人可以帮我弄清楚如何实现它。
感谢。
答案 0 :(得分:3)
如果您确实需要使用问号分隔{name}和书籍,可以按以下方式进行:
@GET
@Path("{name}")
public Response getInformation(@PathParam("name") String name, @QueryParam("books") String books) {
if (books != null) {
// "books" was included after the question mark
return getBooks(name);
} else {
// "books" was not included after the question mark
return Response.ok(loadStudentInformation(name));
}
}
public Response getBooks(String name) {
return Response.ok(loadStudentBooks(name));
}
更新:另外,如果您使用的问号斜杠更合适(根据规范,问号开始查询参数部分),作为另一种选择,您可以考虑编写一个替换问号的ContainerRequestFilter斜杠请求 - 这将允许您在不破坏API兼容性的情况下设计您的资源,而不会破坏API兼容性。
过滤器可以这么简单:
public class QueryParamToPathSegmentFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
String requestUri = request.getRequestUri().toString();
requestUri = requestUri.replace('?', '/');
request.setUris(request.getBaseUri(), UriBuilder.fromUri(requestUri).build());
return request;
}
}
取决于您的URI的外观 - 您可以使其更复杂。 以下是有关如何在应用程序中注册过滤器的更多信息: http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html
答案 1 :(得分:0)
您可以将路径设置为:
@Path("{name}/books")
而不是:
@Path("{name}?books")
然后你就可以获得该网址上的图书清单:
http://myschool/student/jack/books //get student books.
URL中的问号通常意味着您要将参数传递给服务(在这种情况下,您希望使用QueryParam
),但我不认为这就是它的内容,你只想创建一个不同的服务。