2010-12-27 3 views
75

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

api.com/users/[USER-ID] 

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

ответ

74

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

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

Проблема с этим подходом является то, что оно не»кажется, успокоительное. Например, если я хочу получить друзей этого списка пользователей – uclajatt

+6

@uclajatt, REST - это архитектурная модель, а не протокол, и если вы изучите основные API REST, доступные сегодня, вы увидите, что существует несколько способов ее реализации. Подход, который я предлагаю, вероятно, является одним из самых близких к концепции, поскольку он выполняет все описанные здесь ограничения: http://en.wikipedia.org/wiki/Representational_State_Transfer#Constraints. Вы должны использовать CSV только для представления массивов в запросах, а ответы службы должны быть сериализованы с использованием XML или JSON. Существуют ли какие-либо конкретные причины, по которым вы не считаете мой подход REST? –

+3

Ответ Флорина - это реальный способ использования OpenSocial API. – Emerald214

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 отправить массив в виде строки и дематериализации его обратно в контроллер, но вы можете просто отправить массив из int и получить его в виде массива 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, чтобы клиент мог получить доступ к информации о массиве пользователей. Я могу передавать идентификаторы через параметры запроса, но я считаю, что не будет очень спокойным. – uclajatt

+0

@uclajatt Почему вы думаете, что это не RESTful? –

+1

Я считаю, что передача идентификаторов или любых других значений через параметры запроса действительно является спокойным подходом к взаимодействию с системой. Как вы строите вас, Ури, это зависит от вас. Будучи пользователем/всем, пользователями/массивом, массивом/пользователями или любым другим соглашением об именах, которое вы чувствуете, имеет смысл. Принимая во внимание, как среда MVC работает очень легко в использовании, она создает надежный API, так как вы можете организовать и построить вам Uris так же, как вы в них нуждаетесь.После того, как у вас есть Uris, вы можете передать параметры с помощью AJAX в виде одной строки или в виде нескольких значений, если вы используете форму и делаете сообщение в действии MVC. –

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

Позвоните в сервис, используя следующий адрес.

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 
+4

Мне это нравится, потому что GET согласован. В этом примере вы можете использовать одно число или много. И это не действительно поиск (параметры), так как вы даете задний конец точных идентификаторов, которые вы хотите. – markthegrea

14

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

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. Это как узел делает это, а также ...

+13

Я не уверен, что ссылки на стандарты PHP в качестве руководства следовать - лучший совет. https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/ – trebor

+1

Так угловое (google) делает это также –

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

ИМО, выше вызовы не выглядит RESTful, однако это быстрый и эффективный способ решения (у). Но длина URL-адреса ограничена веб-сервером, например tomcat.

RESTful попытка:

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

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

Сервер ответит URI вновь созданного batchtask ресурса.

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

Теперь клиент может принести пакетный ответ или о ходе выполнения задачи, опрашивая

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


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

+2

Запрос POST для _get_ несколько результатов не RESTful , В вашем примере показано создание ресурса, где он подходит для POST, но это совершенно другой случай с исходным вопросом. – Anentropic

+2

Создание временного ресурса RESTful, не так ли? И я получаю ресурсы, используя GET, его снова RESTful. – Nilesh

+0

да, но ничего из этого не было в исходном вопросе, который просто спрашивает о получении информации для нескольких идентификаторов пользователей. – Anentropic

Смежные вопросы