如何构造一个REST API,它为资源提供一个id数组

ucl*_*att 91 api rest

我正在为我的项目构建REST API.获取给定用户的INFO的API是:

api.com/users/[USER-ID]
Run Code Online (Sandbox Code Playgroud)

我还想允许客户端传入用户ID列表.如何构建API以使其成为RESTful并获取用户ID列表?

Flo*_*scu 90

如果要在URL上传递所有参数,那么逗号分隔值可能是最佳选择.然后你会有一个如下所示的URL模板:

api.com/users?id=id1,id2,id3,id4,id5
Run Code Online (Sandbox Code Playgroud)

  • 为什么不呢?api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5 (9认同)
  • 但是,大多数Web服务器支持大约2,000字节的URL长度.如何使我的API支持最多5,000个ID? (9认同)
  • @uclajatt,REST是一种架构模型而不是协议,如果你研究今天可用的主要REST API,你会发现有多种方法可以实现它.我建议的方法可能是最接近概念的方法之一,因为它完成了这里描述的所有约束:http://en.wikipedia.org/wiki/Representational_State_Transfer#Constraints.您只能使用CSV来表示请求中的数组,而服务响应应使用XML或JSON进行序列化.有什么特别的理由说明为什么你不认为我的方法是REST? (7认同)
  • @senfo,我更喜欢id = id1,id2,id3,因为它使URI更短且更容易阅读(例如,在调试操作期间,由人工).如果ids之间存在其他参数,则每个值的各个参数将使URI更难以遵循:api.com/users?id=id1&id=id2&joined-after=2013-01-01&id=id3 (7认同)
  • @senfo在诸如`...?id = 1&id = 2&id = 3`的URL中,[无法保证](http://stackoverflow.com/q/1746507/578288)重复的查询参数将组合成一个数组.使用上面的查询字符串,PHP恰好告诉你`id`等于`[1,2,3]`,但Ruby on Rails告诉你它等于`3`,而其他框架也可能有不同的行为,比如说`id `等于`1`.像`...?id = 1,2,3`这样的网址避免了这种混淆的可能性. (5认同)
  • Florin的答案是OpenSocial API使用的实际方式. (3认同)
  • 这种方法的问题在于它看起来并不安静.例如,如果我想获得此用户列表的朋友 (2认同)

Nil*_*esh 31

 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5
Run Code Online (Sandbox Code Playgroud)

IMO,上面的调用看起来并不像RESTful,但这些是快速有效的解决方法(y).但URL的长度受网络服务器的限制,例如tomcat.

RESTful尝试:

POST http://example.com/api/batchtask

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]
Run Code Online (Sandbox Code Playgroud)

服务器将回复新创建的批处理任务资源的URI .

201 Created
Location: "http://example.com/api/batchtask/1254"
Run Code Online (Sandbox Code Playgroud)

现在,客户端可以通过轮询获取批处理响应或任务进度

GET http://example.com/api/batchtask/1254


这是别人试图解决这个问题的方式:

  • 对_get_多个结果的POST请求不是RESTful.您的示例显示了创建一个适合POST的资源,但这与原始问题完全不同 (7认同)
  • 创建临时资源是RESTful,不是吗?我正在使用GET获取资源,它再次使用RESTful. (2认同)

小智 18

我通过使用找到了另一种做同样事情的方法@PathParam.这是代码示例.

@GET
@Path("data/xml/{Ids}")
@Produces("application/xml")
public Object getData(@PathParam("zrssIds") String Ids)
{
  System.out.println("zrssIds = " + Ids);
  //Here you need to use String tokenizer to make the array from the string.
}
Run Code Online (Sandbox Code Playgroud)

使用以下网址调用该服务.

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76
Run Code Online (Sandbox Code Playgroud)

哪里

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,因为GET是一致的.在此示例中,您可以使用一个或多个.它并不是一个真正的搜索(参数),因为你给后端提供了你想要的精确ID. (5认同)

Kyr*_*her 17

我更喜欢这种方法: -

    api.com/users?id=id1,id2,id3,id4,id5
Run Code Online (Sandbox Code Playgroud)

正确的方法是

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5
Run Code Online (Sandbox Code Playgroud)

要么

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5
Run Code Online (Sandbox Code Playgroud)

这就是机架的方式.这是怎么PHP做的.这也是节点如何做到的......

  • 我不确定引用PHP标准作为遵循的指导是最好的建议.https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/ (19认同)
  • 这就是角度(谷歌)也是如此 (2认同)