Я создаю REST API для своего проекта. API для получения заданной пользовательской информации:
api.com/users/[USER-ID]
Я хотел бы также позволить клиенту передать список идентификаторов пользователей. Как я могу построить API так, чтобы он был RESTful и отобрал список идентификаторов пользователя?
Если вы передаете все свои параметры по URL-адресу, то, возможно, значения, разделенные запятыми, будут лучшим выбором. Тогда у вас будет шаблон URL-адреса, например:
api.com/users?id=id1,id2,id3,id4,id5
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"
}
]
Сервер ответит URI вновь созданного ресурса batchtask.
201 Created
Location: "http://example.com/api/batchtask/1254"
Теперь клиент может получать пакетный ответ или выполнение задачи путем опроса
GET http://example.com/api/batchtask/1254
Вот как другие попытались решить эту проблему:
Я нахожу другой способ сделать то же самое, используя @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
Вот как это делает rack. Вот как это делает php. Вот как это делает node...
Вы можете создать API Rest или готовый проект с использованием ASP.NET MVC и вернуть данные как 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));
}
Затем вы просто вызываете функцию GetUsers через регулярную функцию AJAX, снабжающую массив идентификаторов (в этом случае я использую jQuery stringify для отправки массива в виде строки и дематериализации его обратно в контроллер, но вы можете просто отправить массив ints и принимать его как массив int в контроллере). Я создал весь Restful API с помощью ASP.NET MVC, который возвращает данные в виде перекрестного домена 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"
});
}