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

时间:2010-12-27 19:48:03

标签: api rest

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

api.com/users/[USER-ID]

我还想让客户端传入用户ID列表。如何构建API以使其成为RESTful并接收用户ID的列表?

5 个答案:

答案 0 :(得分:86)

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

api.com/users?id=id1,id2,id3,id4,id5

答案 1 :(得分:28)

 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

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

RESTful尝试:

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

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]

服务器将回复新创建的 batchtask 资源的URI。

201 Created
Location: "http://example.com/api/batchtask/1254"

现在客户端可以通过轮询

获取批量响应或任务进度

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

这是其他人尝试解决此问题的方式:

答案 2 :(得分:17)

我找到了另一种使用@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.
}

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

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76

,其中

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76

答案 3 :(得分:15)

尽管我更喜欢这种方法: -

    api.com/users?id=id1,id2,id3,id4,id5

正确的方法是

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5

rack就是这样做的。 php就是这样做的。这也是节点如何做到的......

答案 4 :(得分:0)

您可以使用ASP.NET MVC构建Rest API或restful项目,并将数据作为JSON返回。 一个示例控制器功能是:

        public JsonpResult GetUsers(string userIds)
        {
           var values = JsonConvert.DeserializeObject<List<int>>(userIds);

            var users = _userRepository.GetAllUsersByIds(userIds);

            var collection = users.Select(user => new { id = user.Id, fullname = user.FirstName +" "+ user.LastName });
            var result = new { users = collection };

            return this.Jsonp(result);
        }
        public IQueryable<User> GetAllUsersByIds(List<int> ids)
        {
            return _db.Users.Where(c=> ids.Contains(c.Id));
        }

然后你只需通过提供Ids数组的常规AJAX函数调用GetUsers函数(在这种情况下,我使用jQuery stringify将数组作为字符串发送并在控制器中取消实现,但你可以发送数组ints并将其作为控制器中的int数组接收。我使用ASP.NET MVC构建了一个完整的Restful API,它将数据作为跨域json返回,并且可以在任何应用程序中使用。当然,如果你可以使用ASP.NET MVC。

function GetUsers()
    {
           var link = '<%= ResolveUrl("~")%>users?callback=?';
           var userIds = [];
            $('#multiselect :selected').each(function (i, selected) {
                userIds[i] = $(selected).val();
            });

            $.ajax({
                url: link,
                traditional: true,
                data: { 'userIds': JSON.stringify(userIds) },
                dataType: "jsonp",
                jsonpCallback: "refreshUsers"
            });
    }