我正在尝试使用 Jersey 编写 REST服务,其中GET方法应该为我写一个对象列表。 GET方法的输入应该采用列表的ID。
假设我将传递n个EmployeeId
,该服务应该返回一份员工列表。
如果在GET方法中不可能有@Consumes
,那么使用其他http方法(如PUT或POST)来检索对象列表会有任何问题吗?
答案 0 :(得分:2)
使用POST
和PUT
进行资源检索与使用REST over HTTP建立的约定相矛盾。仅仅为了使用@Consumes
注释而切换到其中任何一个都是错误的。
如果您需要为资源集合提供其他范围界定信息,请将其放在URL中。具体来说,您可以使用查询参数。这种方式实现分页是一种常见的模式(通过提供一些限制和偏移参数)。您的用例非常相似。
我们假设这是员工资源集合的URL
GET http://www.example.com/employees
可以像这样获取一名员工:
GET http://www.example.com/employees/id1
如果要检索多个员工,可以使用如下查询字符串:
GET http://www.example.com/employees?ids=id1;id3;id8
标识符不需要用分号分隔,这只是您可以获取它们的一种示例。请记住,它被视为一个参数!你必须拆分价值。
以下是您可以从上面的网址中读取此类列表的方法
@Path("employees")
@GET
public Response getEmployees(@QueryParam("ids") String employees){
List<String> ids = Arrays.asList(employes.split(";"));
// Validate the ids, get data from a database,
// prepare a response and return it
}
解析列表可能很麻烦,尤其是如果您想以某种方式验证ID。泽西有一个你可以在这里使用的简洁功能。如果类具有单字符串参数构造函数或SomeType parse(String)
方法,则可以通过解析作为参数传递的字符串(QueryParam
,PathParam
,{{ 1}}等等。)
您可以利用它来使您的资源类更清晰。
FormParam
其中@Path("employees")
@GET
public Response getEmployees(@QueryParam("ids") Employees e){
doFancyStaffWithAValidListOfEmployees(e.asList());
//prepare a response
}
是一个带有String构造函数或parse方法的类,包含所有拆分和验证逻辑,甚至可能包含一些数据库查询。