如何构造一个 RESTAPI,它接受资源的 id 数组

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

api.com/users/[USER-ID]

我还希望允许客户机传递用户 ID 列表。我如何构造这个 API,使它是 RESTful 的,并接受用户 ID 的列表?

147975 次浏览

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

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

您可以使用 ASP.NET MVC 构建 RestAPI 或 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));
}

然后通过提供 ID 数组的常规 AJAX 函数调用 GetUsers 函数(在本例中,我使用 jQuery stringify 将数组作为字符串发送,并在控制器中将其非物质化,但是您可以只发送 int 数组并在控制器中以 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"
});
}

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

使用以下 URL 调用服务。

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

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

    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

这是 架子是怎么做的。这是 我不知道是怎么做的。这也是节点是怎么做的..。

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

我的意思是,上面的调用看起来不是 RESTful 的,但是它们是快速有效的解决方案。但是 URL 的长度受到 webserver 的限制,例如 公猫

宁静的尝试:

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


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

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

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

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

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


这就是其他人试图解决这个问题的方式:

似乎有几种方法可以达到这个目的,我想提供一些解决方法:

GET /users/<id>[,id,...]

由于 URI 长度限制,它确实对可以指定的 id 的数量有限制——我发现这是一件避免滥用端点的好事。

我更喜欢对 ID 使用路径参数,并将 querystring 参数专门用于过滤器。它通过确保在 URI 上响应的文档仍然可以被视为资源并且仍然可以缓存 可以来维护 RESTful-ness (尽管有一些跳转来有效地缓存它)。

在我寻找这种形式的理想解决方案的过程中,我对评论很感兴趣:)