Как создать REST API, который принимает массив идентификаторов для ресурсов

70

Я создаю REST API для своего проекта. API для получения заданной пользовательской информации:

api.com/users/[USER-ID]

Я хотел бы также позволить клиенту передать список идентификаторов пользователей. Как я могу построить API так, чтобы он был RESTful и отобрал список идентификаторов пользователя?

  • 0
    Любой принятый ответ на этот вопрос?
  • 0
    Наиболее общий ответ дает @Shuja, потому что другие ответы от почтальона не сработали и зависят от базы данных. Однако у вас может быть конечная точка API для запроса нескольких идентификаторов.
Теги:
rest

5 ответов

78

Если вы передаете все свои параметры по URL-адресу, то, возможно, значения, разделенные запятыми, будут лучшим выбором. Тогда у вас будет шаблон URL-адреса, например:

api.com/users?id=id1,id2,id3,id4,id5
  • 2
    Проблема этого подхода в том, что он не выглядит успокоительным. Например, если я хочу получить друзей из этого списка пользователей
  • 7
    @uclajatt, REST - это архитектурная модель, а не протокол, и если вы изучите основные API-интерфейсы REST, доступные сегодня, вы увидите, что существует несколько способов ее реализации. Подход, который я предлагаю, вероятно, является одним из наиболее близких к этой концепции, поскольку он выполняет все ограничения, описанные здесь: en.wikipedia.org/wiki/… . Вы будете использовать CSV только для представления массивов в запросах, а ответы служб должны быть сериализованы с использованием XML или JSON. Есть ли какие-то конкретные причины, почему вы не считаете мой подход ОТДЫХОМ?
Показать ещё 11 комментариев
20
 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


Вот как другие попытались решить эту проблему:

  • 6
    Запрос POST для получения нескольких результатов не является RESTful. Ваш пример показывает создание ресурса там, где он соответствует POST, но это совершенно другой случай с исходным вопросом.
  • 2
    Создание временного ресурса - это RESTful, не так ли? И я получаю ресурсы, используя GET, снова RESTful.
Показать ещё 5 комментариев
14

Я нахожу другой способ сделать то же самое, используя @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
  • 5
    Мне нравится этот, потому что GET является последовательным. Вы можете использовать один или несколько номеров в этом примере. И это на самом деле не поиск (параметры), так как вы предоставляете бэкенду именно те идентификаторы, которые вам нужны.
  • 1
    Я вижу, что наиболее одобренный ответ не работает, и ваш ответ, вероятно, самый общий. Должен быть принят в качестве ответа.
12

Насколько я предпочитаю этот подход: -

    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...

  • 17
    Я не уверен, что ссылки на стандарты PHP в качестве руководства для подражания - лучший совет. eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
  • 2
    Вот как это делает angular (Google)
Показать ещё 1 комментарий
0

Вы можете создать 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"
            });
    }
  • 3
    Извините, я не спрашивал, как реализовать API. Я просто спрашивал, как создать URI API, чтобы клиент мог получить доступ к информации о массиве пользователей. Я могу передавать идентификаторы через параметры запроса, но я считаю, что это не будет очень успокоительным.
  • 0
    @uclajatt Почему вы думаете, что это не RESTful?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню