How to construct a REST API that takes an array of id's for the resources
我正在为我的项目构建REST API。 获取给定用户的INFO的API是:
1 | api.com/users/[USER-ID] |
我还想允许客户端传入用户ID列表。 如何构建API以使其成为RESTful并获取用户ID列表?
如果要在URL上传递所有参数,那么逗号分隔值可能是最佳选择。然后你会有一个如下所示的URL模板:
1 | api.com/users?id=id1,id2,id3,id4,id5 |
1 2 | 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尝试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | POST http://example.com/api/batchtask [ { method :"GET", headers : [..], url :"/users/id1" }, { method :"GET", headers : [..], url :"/users/id2" } ] |
服务器将回复新创建的批处理任务资源的URI。
1 2 | 201 Created Location:"http://example.com/api/batchtask/1254" |
现在,客户端可以通过轮询获取批处理响应或任务进度
这是别人试图解决这个问题的方式:
- Google云端硬盘
- Facebook的
- 微软
- Subbu Allamaraju
我找到了另一种使用
1 2 3 4 5 6 7 8 | @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. } |
使用以下网址调用该服务。
1 | http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76 |
哪里
1 | http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76 |
我更喜欢这种方法: -
1 | api.com/users?id=id1,id2,id3,id4,id5 |
正确的方法是
1 | api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5 |
要么
1 | api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5 |
这就是机架的方式。 php就是这样做的。这也是节点如何做到的......
您可以使用ASP.NET MVC构建Rest API或Restful项目,并将数据作为JSON返回。
一个示例控制器功能是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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将数组作为字符串发送并在控制器中取消实现,但你可以发送整数数组并接收它作为控制器中的int数组)。我使用ASP.NET MVC构建了一个完整的Restful API,它将数据作为跨域json返回,并且可以在任何应用程序中使用。当然,如果你可以使用ASP.NET MVC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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" }); } |