리소스에 대한 ID 배열을 사용하는 REST API를 구성하는 방법


103

내 프로젝트를위한 REST API를 구축하고 있습니다. 주어진 사용자의 정보를 얻기위한 API는 다음과 같습니다.

api.com/users/[USER-ID]

또한 클라이언트가 사용자 ID 목록을 전달하도록 허용하고 싶습니다. RESTful이되고 사용자 ID 목록을 가져 오도록 API를 어떻게 구성 할 수 있습니까?


가장 일반적인 대답은 @Shuja에 의해 제공되며 우체부의 다른 대답이 작동하지 않았고 데이터베이스 백엔드에 의존합니다. 그러나 여러 ID를 요청하는 API 끝점을 가질 수 있습니다.
Eswar

답변:


97

URL의 모든 매개 변수를 전달하는 경우 쉼표로 구분 된 값이 최선의 선택 일 것입니다. 그러면 다음과 같은 URL 템플릿이 생깁니다.

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

7
@uclajatt, REST는 프로토콜이 아닌 아키텍처 모델이며 오늘날 사용 가능한 주요 REST API를 연구하면이를 구현하는 여러 방법이 있음을 알 수 있습니다. 내가 제안하는 접근 방식은 en.wikipedia.org/wiki/…에 설명 된 모든 제약 조건을 충족 하므로 개념에 가장 가까운 접근 방식 중 하나 일 것입니다 . 서비스 응답은 XML 또는 JSON을 사용하여 직렬화해야하는 반면 요청의 배열을 나타내는 데 CSV 만 사용합니다. 내 접근 방식을 REST로 간주하지 않는 특별한 이유가 있습니까?
Florin Dumitrescu

10
왜 안돼? api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5
senfo 2013-06-26

7
@senfo, 내가 선호하는 id = id1, id2, id3 왜냐하면 URI를 더 짧고 쉽게 읽을 수 있기 때문입니다 (예를 들어, 디버깅 작업 중에 사람에 의해). api.com/users?id=id1&id=id2&joined-after=2013-01-01&id=id3 : ID 사이에 다른 매개 변수가있는 경우 URI를 만들 것입니다 각 값에 대한 개별 매개 변수, 특히 열심히 따라합니다
플로린 Dumitrescu가

12
그러나 대부분의 웹 서버는 약 2,000 바이트의 URL 길이를 지원합니다. 내 API가 최대 5,000 개의 ID를 지원하도록하는 방법은 무엇입니까?
nicky_zs

6
같은 URL을에서 @senfo …?id=1&id=2&id=3, 보장은 없습니다 중복 쿼리 매개 변수가 배열로 결합 될 것입니다. 위의 쿼리 문자열을 사용하면 PHP는 id같음 을 알려 [1, 2, 3]주지만 Ruby on Rails는 같음을 알려줍니다. 3다른 프레임 워크도 다르게 작동 할 수 있습니다 (예 : idequals) 1. 이와 같은 URL은 …?id=1,2,3이러한 혼동 가능성을 방지합니다.
Rory O'Kane 2016

33
 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를 회신합니다. 리소스의 합니다.

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

이제 클라이언트는 폴링을 통해 배치 응답 또는 작업 진행률을 가져올 수 있습니다.

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


이것이 다른 사람들이 시도한 방법입니다. 이이 문제를 해결 .


7
여러 결과 를 얻기위한 POST 요청 은 RESTful이 아닙니다. 귀하의 예는 POST에 적합한 리소스 생성을 보여 주지만 원래 질문과는 완전히 다른 경우입니다
Anentropic

2
임시 리소스를 만드는 것은 RESTful입니다. 그리고 다시 RESTful 인 GET을 사용하여 리소스를 얻고 있습니다.
Nilesh

예,하지만 원래 질문에는
없었

1
지적 해 주신 @Anentropic에게 감사드립니다. 리소스에 대한 ID 배열을 사용하는 REST API를 구성하는 방법을 묻는 질문을 다시 읽었습니다 . 동의합니다. 제 대답은 다릅니다. 요점을 이해하지 못해 죄송합니다.
일레시

여러 사용자를 확보하는 RESTful 방법이이 메커니즘을 통하기 때문에이 답변이 마음에 듭니다.
Shane Courtrille 2016

20

을 사용하여 동일한 작업을 수행하는 다른 방법을 찾습니다 @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이 일관 적이기 때문에 이것을 좋아합니다. 이 예에서는 하나 이상의 숫자를 사용할 수 있습니다. 그리고 백엔드에 원하는 정확한 ID를 제공하므로 실제로 검색 (매개 변수)이 아닙니다.
markthegrea

1
가장 많이 찬성 된 답변이 작동하지 않으며 귀하의 답변은 아마도 가장 일반적인 답변 일 것입니다. 답으로 받아 들여야합니다.
Eswar

18

이 접근 방식을 선호하는만큼 :-

    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가하는 방법 입니다. 이것이 노드가하는 방법입니다 ...


19
따라야 할 지침으로 PHP 표준을 참조하는 것이 최선의 조언이라고 확신하지 않습니다. eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
trebor

이것은 Flask가하는 방식이 아닙니다.
jscul

0

ASP.NET MVC를 사용하여 Rest API 또는 편안한 프로젝트를 빌드하고 데이터를 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));
        }

그런 다음 Ids 배열을 제공하는 일반 AJAX 함수를 통해 GetUsers 함수를 호출합니다 (이 경우 jQuery stringify를 사용하여 배열을 문자열로 보내고 컨트롤러에서 다시 비 물질화하지만 int 배열을 보내고받을 수 있습니다. 컨트롤러에서 int의 배열로). 크로스 도메인 json으로 데이터를 반환하고 모든 앱에서 사용할 수있는 ASP.NET MVC를 사용하여 전체 Restful API를 빌드했습니다. 물론 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 구현 방법을 묻지 않았습니다. 클라이언트가 사용자 배열에 대한 정보에 액세스 할 수 있도록 API URI를 구성하는 방법을 묻고있었습니다. 쿼리 매개 변수를 통해 ID를 전달할 수 있지만 그다지 편안하지 않을 것이라고 생각합니다.
uclajatt 2010

@uclajatt 왜 RESTful이 아니라고 생각합니까?
Darrel Miller

1
쿼리 매개 변수를 통해 id 또는 다른 값을 전달하는 것이 실제로 시스템과 상호 작용하는 편안한 접근 방식이라고 생각합니다. Uri를 구성하는 방법은 당신에게 달려 있습니다. 사용자 / 모든 사용자, 사용자 / 배열, 배열 / 사용자 또는 의미가 있다고 생각하는 다른 명명 규칙입니다. MVC 프레임 워크의 작동 방식을 고려할 때 필요에 따라 Uris를 구성하고 빌드 할 수 있으므로 편안한 API를 빌드하는 데 매우 쉽게 사용할 수 있습니다. Uris가 있으면 AJAX를 하나의 문자열로 사용하여 매개 변수를 전달할 수 있습니다. 또는 양식을 사용하고 MVC 작업에 게시하는 경우 여러 값으로.
Vasile Laur

1
@uclajatt 이제이 게시물에서 쿼리 매개 변수에 쉼표로 구분 된 목록을 전달하는 것이 RESTful이 아니라고 생각하는 이유에 대해 두 번 질문을 받았습니다. ! 쿨하지 않아.
samis 2013-08-13
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.