2016-10-10 9 views
0

派生したデータを提供するためのマイクロサービスがある場合は、残りのAPIをどのように設計する必要があるか分かりません。Rest API:派生データにアクセスするためのパス

私は顧客を持っていると私は顧客にアクセスする場合と、私はAPIを定義します:これは、顧客

について私たちが知っているすべてのものを返します

/顧客/ 1234

- :例えば

しかし、顧客が以前に別のアカウント番号でシステムに知らされているかどうかを私に知らせるマイクロサービスを提供したい場合は、どうすればいいですか?私はどちらが正しいいないようです

このロジックはmicroserviceになりたいが、どのように私はAPIを定義します

顧客/ 1234/previouslyKnow

customerPreviouslyKnown/1234。最初のケースでは、それは意味

顧客/

1234は、すべての顧客情報を取得するために使用することができますがmicroserviceがこれを提供していません。

混乱しています!

説明のためにいくつかの詳細を追加します。

私の問題は、顧客関連のすべてを処理する大規模なサービスが本当に必要ないと思います。顧客の注文、顧客情報、顧客の履歴、顧客のステータス(生きている、紛失した、死んだ、など)を処理する軽量サービスがあれば、より良いでしょう。

それはこれらのすべては

/顧客/ XXXX

で始まるだろう唯一の顧客/ XXXXがで余分に与えられた場合にはそのすべてのサービスがバック顧客オブジェクトを提供することが期待される私を打ちます/ ordersのようなパス

また、上記のデータのいくつかは、実際にはどこからでも保持されているわけではなく、このロジックを呼び出しコードではなくサービス内に隠しておきたいものです。では、これがどのように要求され、返されますか?

+0

お客様が存在するかどうか確認しますか? –

+1

リソースが存在するかどうかをチェックしたい場合は、 'HEAD/customer/1234'を実行してください。それは、応答のために全身を集める必要なく、応答を生成します。 –

+0

私はそれについての答えを書いていましたが、@RobertBräutigamはもっと速かったです:) –

答えて

0

マイクロサービスを行うということは、各方法ごとに個別のアーティファクトを持つことを意味するものではありません。カップリングと結束のルールはマイクロサービスの世界にも当てはまります。したがって、顧客に関連するすべてのデータを照会できる場合、関連するリソースはおそらく同じサービスに属している必要があります。

だからあなたのリソースは次のようになり​​/customersのに対し(複数!)/customers/{id}は、単一の顧客と​​顧客が以前持っていた顧客番号のリストである、顧客のリストです。

操作ではなくリソース内で考えてみてください。したがって、以前に使用された顧客番号のリストを返すほうがブール値を返すよりも優れています。 /customer/{id}/previous-accountsはもっと良いと思います...

に戻るprevious-accountsという値が同じデータから直接派生している場合、つまり2番目のデータベースなどを照会する必要がない場合私もちょうど、顧客の表現に値を追加することをお勧めします:データが保存されたかどうかの問題ので、それへのサービスクライアントが境界上に表示すべきではないはずです導出され

{ 
    "id": "1234", 
    "firstName": "John", 
    "lastName": "Doe", 
    "previouslyKnown": true, 
    "previousAccounts": [ 
     { 
      "id": "987", 
      ... 
     } 
    ] 
} 

かどうか。

別のリソースまたは別のサービスを追加することは、複雑で複雑で複雑であり、長期的にはあなたを殺します。

受注は、顧客データとは明らかに異なる(......生きて、死んで、失われた)

顧客の注文、顧客情報、顧客履歴、顧客ステータス:

あなたは他の例に言及しますしたがって、別のサービスに存在する必要があります。注文には通常、世界的に一意の注文IDもあります。したがって、リソース/orders/{orderId}があります。顧客IDによって注文を検索することも可能である:私は、顧客が特定の顧客IDで識別された注文のリストを与える読み込み

/orders;customer={customerId} 

リスト形式の休憩リソースをフィルタリングするこれらのパラメータは、matrix parametersと呼ばれます。クエリパラメータを使用することもできます:/orders?customer={customerId}これもかなり一般的ですが、マトリックスパラメータはURLの特定の部分に明確に属しているという利点があります。考えてみましょう以下:

/orders/notifications?customer=1234 

/orders;customer=1234/notifications 

これは、次のようになりクエリパラメータでID 1234

で顧客の注文に属する通知のリストを返します

URLから注文がフィルタリングされていて、通知ではないことは明らかではありません。

欠点は、マトリックスパラメータのフレームワークサポートが様々であることです。サポートするものもあれば、サポートしないものもあります。

私は行列のパラメータをここで最高にしたいと思いますが、クエリパラメータもOKです。

戻ってあなたのリストに行く:

顧客の注文、顧客情報、顧客履歴、顧客ステータス(ライブ、失われた、死んだ....)

最も

顧客情報や顧客ステータス同じサービス(顧客コアデータなど)に属している可能性があります。お客様の履歴も表示されます。私はそれを別々に考えなければならない理由がない限り、そこに配置します。たぶん顧客履歴は、別のサービスの価値があるような複雑なドメインです(確かにそうかもしれません):/customer-history/{id}またはおそらくちょうど/customer/{id}です。

異なるサービスが、1つの顧客に関する異なる情報を提供するために同じパスを使用することは問題ありません。それらは異なるサービスであり、異なるエンドポイントを持つので、衝突はまったくありません。私は本当にあなたの質問を理解している場合はわからない

https://customer-core-data.service.lan/customers/1234 
https://customer-history.service.lan/customers/1234 
0

:理想的にはあなたも対応するサービスを指すDNSエイリアスを持っています。ただし、サーバーに特定のリソースが存在するかどうかを確認する方法を示します。 http://example.org/api/customers/1


は、サーバーが(この状況では、URLは識別子1と顧客を探し出し)特定のリソースを見つけURLを提供して考えてみましょう。

クライアントがこのURLにGETリクエストを実行すると、クライアントは次のような結果は、(認証/認可の問題のような他の状況があるかもしれないが、のは、単純な、それを維持させる)を期待することができます

  • の場合顧客が識別子1の顧客が存在する場合、クライアントはレスポンスペイロード内のステータスコード200とレスポンス(たとえば、顧客を表すJSONまたはXML)の表現を受け取ることになっています。
  • 識別子1の顧客が存在しない場合、クライアントはステータスコード404の応答を受け取ることになっています。

リソースが存在するかどうかをチェックするには、リソース表現(顧客を表すJSONまたはXML)は必要ありません。ここで関連するステータスコードは、リソースが存在する場合は200、リソースが存在しない場合は404です。 GETリクエストの他に、顧客を見つけるURL(http://example.org/api/customers/1)はHEADリクエストを処理することもできます。 HEADメソッドはGETメソッドと同じですが、サーバーはHEADリクエストでリソース表現を送信しません。したがって、リソースが存在するかどうかを確認すると便利です。

HEAD方法に関する詳細を参照してください:

4.3.2. HEAD

HEAD方法は、サーバが応答(すなわち、応答が終了してメッセージ本文を送信しない なければならないことを除いてGETと同じです でヘッダーセクションの末尾)。サーバは、 要求がGETであった場合に送信されたように、同じ ヘッダーフィールドをHEAD要求に応答して送信しなければならない(SHOULD)。ただし、ペイロードヘッダフィールドを省略することができる。このメソッドは、 表現データを転送せずに、選択された表現についての メタデータを取得するために使用でき、 有効性、アクセシビリティ、および最近の変更のハイパーテキストリンクのテストによく使用されます。 [...]


リソースリソース表現との違いが明確でない場合は、このanswerをチェックしてください。

0

私が既に素晴らしい答えに追加したいことは、RESTを正しく行うとURLSのデザインはそれほど重要ではないということです。

RESTの重要な教訓の1つは、URLが発見されることです。既に顧客の情報を持っており、 "以前に知られていた"情報が何であるかを知りたいクライアントは、主要な顧客リソース上のURLを発見するだけでよいはずです。そこから "以前に知られた"情報にリンクする場合、URLが別のドメイン、パス、またはプロトコルにあるかどうかは関係ありません。

もしあなたがアプリケーションが別の基本パス上にある "これまでの知識"があれば当然のことです。

関連する問題