我正在尝试使用Jersey编写一个REST 服务,其中 GET 方法应该给我写一个对象列表。GET 方法的输入应采用列表的 id。假设我将传递 n 个数字,服务应该返回给我一份员工名单。EmployeeId
如果 GET 方法中不可能有@Consumes
,那么使用 http 的其他方法如 PUT 或 POST 来检索对象列表会不会有什么问题?
使用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
标识符不需要用分号分隔,这只是您可以获取它们的方式的一个示例。请记住,它被视为单个参数!您必须拆分这些值。
以下是您如何从上面的 URL 中读取此类列表的方法
@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。Jersey 有一个简洁的功能,你可以在这里使用。如果一个类有一个单字符串参数的构造函数或SomeType parse(String)
方法,它可以被框架通过解析作为参数传递的字符串(QueryParam
, PathParam
,FormParam
等)注入。
您可以利用它来使您的资源类更干净。
@Path("employees")
@GET
public Response getEmployees(@QueryParam("ids") Employees e){
doFancyStaffWithAValidListOfEmployees(e.asList());
//prepare a response
}
whereEmployees
是一个带有 String 构造函数或 parse 方法的类,包含所有的拆分和验证逻辑,甚至可能包含一些数据库查询。