リソースのIDの配列を取るREST APIを構築する方法


103

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

api.com/users/[USER-ID]

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


最も一般的な答えは@Shujaです。郵便配達員からの他の回答が機能せず、データベースバックエンドに依存しているためです。ただし、APIエンドポイントを使用して複数のIDをリクエストできます。
Eswar

回答:


97

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

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

7
@ uclajatt、RESTはアーキテクチャモデルであり、プロトコルではありません。今日利用可能な主要なREST APIを研究すると、それを実装する方法が複数あることがわかります。私が提案しているアプローチは、en.wikipedia.org / wiki / …で説明されているすべての制約を実現するため、おそらくコンセプトに最も近いアプローチの1つです。サービスの応答はXMLまたはJSONを使用してシリアル化する必要がありますが、CSVを使用してリクエストの配列を表すだけです。私のアプローチをRESTと見なさない特別な理由はありますか?
Florin Dumitrescu 2010

10
これはなぜですか?api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5
senfo

7
@senfo、私はid = id1、id2、id3を好みます。これにより、URIが短くなり、(たとえば、デバッグ操作中に)人間が読みやすくなるからです。api.com/users?id=id1&id=id2&joined-after=2013-01-01&id=id3:IDSの間に、他のパラメータがある場合、各値のための個々のパラメータは、特に難しく従ってURIになるだろう
フローリンDUMITRESCU

12
ただし、ほとんどのWebサーバーは約2,000バイトのURLの長さをサポートしています。APIで最大5,000個のIDをサポートするにはどうすればよいですか?
nicky_zs

6
@senfoなどのURL …?id=1&id=2&id=3では、重複するクエリパラメータが配列に結合される保証はありません。上記のクエリ文字列を使用すると、PHPは偶然にidequals を通知しますが[1, 2, 3]、Ruby on Railsはそれをequals と通知し3、他のフレームワークも動作が異なるid場合があり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などの Webサーバーによって制限されます。

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ですよね?そして、GETを使用してリソースを取得しています。これもRESTfulです。
Nilesh 2016年

はい。しかし、元の質問には何もありませんでした。複数のユーザーIDの情報を取得することについて質問するだけです
Anentropic

1
指摘してくれて@Anentropicに感謝します。リソースのIDの配列を取得するREST APIを構築する方法を尋ねる質問をもう一度読みます。同意します。私の答えは異なります。あなたのポイントを得られないために申し訳ありません。
Nilesh

複数のユーザーを取得する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が一貫しているので、これが好きです。この例では、1つまたは複数を使用できます。また、バックエンドに正確なIDを提供しているため、実際には検索(パラメーター)ではありません。
markthegrea 2012

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 2019

0

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全体を構築しました。この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"
            });
    }

3
申し訳ありませんが、APIの実装方法を尋ねることはありませんでした。クライアントがユーザーの配列に関する情報にアクセスできるように、API URIを構築する方法を尋ねていました。クエリパラメータを介してIDを渡すことができますが、それはあまり落ち着かないと思います。
uclajatt 2010

@uclajattなぜRESTfulでないと思いますか?
Darrel Miller

1
クエリパラメータを介してIDやその他の値を渡すことは、確かにシステムと対話するための安らかなアプローチだと思います。Uriをどのように構築するかは、あなた次第です。users / all、users / array、array / users、またはあなたが理にかなっていると感じるその他の命名規則であること。MVCフレームワークがどのように機能するかを考慮して、必要なだけUrisを整理して構築できるので、MVCフレームワークがRESTful APIを構築するために非常に簡単に使用できるようになります。または、フォームを使用してMVCアクションへの投稿を行う場合は、複数の値として。
Vasile Laur 2010

1
@uclajattそれは今度はこの投稿で質問パラメーターにカンマ区切りのリストを渡すことはRESTfulではなく、答えるのも面倒だと思う理由が2度あるのですが、これらの非常にもっともらしい解決策を受け入れるのは言うまでもありません!? !クールではありません。
samis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.