2017-07-20 13 views
1

「5つのベストセラー商品」、「5つの最近追加された商品」、「5つの素晴らしいオファー」の商品を表示する画面を複数のクライアントに作成したいと考えています。これらはすべてカルーセルとして表示されます。REST Hateos:クライアントが単純な固定URLを通じてRESTアプリケーションに入ることを確認するにはどうすればよいですか?

これらのために安らかなAPIを作成したいと考えています。私たちは、次のAPIを作成しました:

  1. /API/bestsellingproduct/
  2. /API/recentlyaddedproduct/
  3. /API/greatofferproduct /現在

、すべてのクライアントすなわちデスクトップ、モバイル、アンドロイド、 iosはこれらのURIをハードコードしています。これらのURLを明日変更すると迷惑をかけることになりますが、RESTは「RESTクライアントは単純な固定URLを使用してRESTアプリケーションに入ります」(https://en.wikipedia.org/wiki/HATEOAS)」

この場合、すべてのクライアントが単純な固定URLを通じてアプリケーションを入力しますか?

答えて

1

HATEOASでは、URIは変更可能なように発見可能(および文書化されていません)です。つまり、あなたのシステムの入り口になっていない限り(Cool URIs、クライアントによってハードコーディングできる唯一のものです)、あなたの残りの部分を進化させる能力を望むなら、あまりにも多くのものを持つべきではありません将来のシステムのURI構造これは、実際には、RESTの機能のうち、最も多くのものの1つです(useful)。

残りの非クールなURIについては、時間の経過と共に変更される可能性があります。また、APIドキュメントでは、実行時にハイパーメディアトラバーサルによって発見されるべきであるという事実を説明する必要があります。

Richardson's Maturity Model (level 3)を見ると、これはリンクが再生される場所になります。たとえば、トップレベルの/ api/version(/ 1)から、グループへのリンクがあることがわかります。ここでは、これがHAL Browserのようなツールで見ることができる方法は次のとおりです。

ルート:

{ 
    "_links": { 
    "self": { 
     "href": "/api/root" 
    }, 
    "api:bestsellingproduct": { 
     "href": "http://apiname:port/api/bestsellingproduct" 
    }, 
    "api:recentlyaddedproduct": { 
     "href": "http://apiname:port/api/recentlyaddedproduct" 
    }, 
    "api:greatofferproduct": { 
     "href": "http://apiname:port/api/greatofferproduct") 
    } 
    } 
} 

ここでの利点は、クライアントが唯一の関係リソース構造以外にも、明らかに(リンク)の名前を(知っておく必要があるだろうということでしょう/プロパティ)、サーバーはほとんどの場合、関係(およびリソース)URLを自由に変更できます。

あなたも同じルートAPI呼び出しで返されるためにそれらを埋め込むことができます:偉大な返信用

{ 
    "_embedded": { 
    "bestsellingproduct": [ 
     {    
      "id": "1", 
      "name": "prod test" 
     }, 
     {    
      "id": "2", 
      "name": "prod test 2" 
     } 
    ], 
    "recentlyaddedproduct": [ 
     {    
      "id": "3", 
      "name": "prod test 3" 
     }, 
     {    
      "id": "5", 
      "name": "prod test 5" 
     } 
    ] 
} 
+0

感謝を。そのようなハードコーディングを避けることは、今後URIの変更があった場合にのみ私たちを救うでしょう。これらの変更されたURIの応答本文が以前のURIの応答の応答本体と同じであることを確認する必要があります。クライアントレベルでこのようなハードコーディングを避ける方法はありますか(URIのハードコードを避けるためここで行っています) – maverick

+0

モデルは契約の一部であり、破損することはありません。しかし、下位互換性を破る必要がある状況に遭遇した場合(例えば、新しいモデルを追加するだけでモデルからプロパティを削除するなど)、バージョン管理を行うことができます: '/ api APIバージョンを選択するためにクライアントに残しておきます。 –

+0

クライアントには2つのタイプのビューがあり、1つのビュータイプにはベストセラー/最近追加された/ greatoffer-1のためのカルーセルがあります。製品。もう1つのビュータイプは、予算内の製品用のイメージボタン、すなわち「モバイルが100ドル未満」のイメージ、「モバイルが200ドル未満」のイメージがあります。画像ボタンの表示では、jsonは[{"title": "mobile-less-than-$ 100"、 "URI": "/ api/stocks /?budget = 0-100"}]のようになります。カルーセルとボタンを上下に動かして実験したいのであれば、どのように扱うべきですか? – maverick

関連する問題