2012-05-01 12 views
6

名前と複数の場所(/ users/{id} /場所)を持つユーザー(/ users/{id})を考えてみましょう。RESTful Webサービスでは、応答DTOに子DTOが含まれている必要がありますか?

私はユーザー(/ user/{id})を要求するとき、そのユーザーをID、名前、場所などで完全に表現する必要がありますか?たとえば、id = 123(/ users/123)のユーザーのリクエストでどのJSON DTOを使用するとしますか?

1){"id":123、 "name": "Peter"、 "locations" 2){"id":123、 "name": "Chicago"}、{"id":2、 "name": "New York"}}}

2){"id" ":" Peter "、" locations ":[{" id ":1}、{" id ":2}}}

3){" id ":123、" name "位置 ":[1、2]}

4){ "ID" 123は、 "名前":" ピーター」}

は押し引き、このより主観的ですDTOのサイズと典型的なユースケースで要求される要求の間には何か?関連するすべてのデータ(1)を単純に含めることになりますが、デベロッパーが実際に必要とするデータのすべてを取得するために複数の呼び出しを行うことを要求するだけでは不十分です。

+1

あなたはサブ要素のコレクションを列挙し、オン/オフにするためにクエリパラメータを追加しないだろう、なぜ任意の理由と呼ばれますか?それはaを加えることと似ていませんか?出力のフォーマットを調整するためのformat = {json | xhtml} ... – ScottCher

+0

主に開発時間のためです。予期せぬ不必要な追加を導入したくありません。私はちょうど「正しい」、あるいは少なくとも合理的で素早い方法でやりたいと思っています。 –

答えて

3

RESTfulなことには:だから私はあなたの応答の大きさを懸念している場合、私はまだ、ユーザーの場所にちょうどURIを含めるようにしたRESTfulだろうと信じて数4

を排除しますあなたは必ずしもリソースの完全な表現を返す必要はありません あなたは、あなたのAPIのユーザが必要とするすべての情報(アプリケーション状態のエンジンとしてのハイパーメディア - 別名HATEOAS

を取得/設定する手段としてハイパーメディアを有効にする必要があります

これを満たすには、@bowmanbの提案をpすべての場所のURIを指定するか、各場所のURIを個別に追加します。リソースを使って何かをする他のオプションのためにURIを追加したいと思うかもしれません。ジム・ウェバーによってHATEOASに良い記事があります

、サバスParastatidis &イアン・ロビンソンは"how to GET a cup of coffee"

2

私はこの世界で初心者ですが、私は安らかなAPIを構築しており、全く同じ問題に直面しています。私の最初の仕事はすべてを含めることでした - 結果はあなたの選択肢のように見えます(1)。実際、私はもう少し進んで各オブジェクトにURIを含めました。理論的には、応答は十分にインテリジェントなクライアントによってナビゲートできるようにしました。

私はあなたの「ユーザー」オブジェクトに相当する私の特定の属性が非常に大きいことを発見しました。パフォーマンスには影響していないようですが、クライアントがその特定の属性に関するすべての情報を必要としないように思われます。ほとんどのクライアントはIDと名前を必要とします。だから、私はその属性のための私のデフォルトのアプローチを変更します。

ボトムライン - 私の初心者の意見では、その決定はクライアントの期待される使用に基づいている - クライアントは何を見たいと思いますか?

1

クライアントがユーザーの場所を見つける方法を決定する方法がいくつかあります。

{ "id":123, "name":"Peter", "locations":"https://stackoverflow.com/users/123/locations" } 
+0

次に、あなたの場所のコレクションは、各場所への個々のURI参照でしょうか?例:/ locations/{locationid} – ScottCher

+0

これは私が考えていたものです。ユーザーの場所がサービスにとって重要であり、応答のサイズが問題でない場合は、URIを含む/ users/{id}応答のすべてを含めます(@Arnon Rotem-Gal-Ozによると)。 "{" id ":" 123 "、" name ":" Peter "、" locations ":[{" "id":1、 "name": "Chicago"、 "uri": "/ users/123/locations/1" }、{"id":2、 "name": "New York"、 "uri": "/ users/123/locations/2"}}} ' – anon

関連する問題