web-dev-qa-db-ja.com

リソースのIDの配列を受け取るREST AP​​Iを構築する方法

プロジェクト用にREST AP​​Iを構築しています。特定のユーザーの情報を取得するためのAPIは次のとおりです。

api.com/users/[USER-ID]

クライアントがユーザーIDのリストを渡すことも許可したいと思います。 RESTfulでユーザーIDのリストを取得するようにAPIを構築するにはどうすればよいですか?

89
uclajatt

URLですべてのパラメーターを渡す場合、おそらくコンマ区切りの値が最良の選択です。次に、次のようなURLテンプレートを作成します。

api.com/users?id=id1,id2,id3,id4,id5
88
 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の長さは、Webサーバーによって制限されます(例: Tomcat )。

レストフル試行:

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

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

サーバーは、新しく作成されたbatchtaskリソースのURIを返信します。

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

クライアントはポーリングによりバッチ応答またはタスクの進行状況を取得できるようになりました

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


これは、他の人がこの問題を解決しようとした方法です

30
Nilesh

@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
17
Shuja

私がこのアプローチを好む限り:

    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 の方法です。これもノードがそれを行う方法です...

16
Kyristopher

ASP.NET MVCを使用してRest APIまたはRestfulプロジェクトをビルドし、データを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の配列として受け取ります)。 ASP.NET MVCを使用してRestful API全体を構築し、クロスドメイン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"
            });
    }
0
Vasile Laur