Как создать REST API, который принимает массив идентификаторов для ресурсов - PullRequest
87 голосов
/ 27 декабря 2010

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

api.com/users/[USER-ID]

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

Ответы [ 5 ]

87 голосов
/ 27 декабря 2010

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

api.com/users?id=id1,id2,id3,id4,id5
29 голосов
/ 07 сентября 2015
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

IMO, вызовы выше не выглядят RESTful, однако это быстрый и эффективный обходной путь (у).Но длина 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


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

17 голосов
/ 22 августа 2011

Я нахожу другой способ сделать то же самое, используя @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
16 голосов
/ 06 июля 2015

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

    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

Вот как стойка делает это.Вот как это делает php .Вот как это делает узел ...

0 голосов
/ 27 декабря 2010

Вы можете создать Rest API или релакс-проект, используя 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 в контроллере). Я построил весь API Restful, используя 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"
            });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...