0

我正在尝试使用Jersey编写一个REST 服务,其中 GET 方法应该给我写一个对象列表。GET 方法的输入应采用列表的 id。假设我将传递 n 个数字,服务应该返回给我一份员工名单。EmployeeId

如果 GET 方法中不可能有@Consumes,那么使用 http 的其他方法如 PUT 或 POST 来检索对象列表会不会有什么问题?

4

1 回答 1

2

使用POSTPUT进行资源检索与为使用 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 方法的类,包含所有的拆分和验证逻辑,甚至可能包含一些数据库查询。

这是一篇关于编写此类参数类的好文章

于 2013-06-08T20:29:34.253 回答