web-dev-qa-db-ja.com

AngularJSを使用したHATEOASクライアント

Angularに隠されている機能があるか、HATEOAS準拠のRestfulクライアントを簡単に作成するためにいくつかのサードパーティライブラリによって公開されているかどうか疑問に思っていました。

バックエンド側では、HATEOAS JSON APIを生成するためにSpring Data/RESTを使用しています。しかし、それを消費することはまったく別の話です。

たとえば、次の3つのエンティティがあります。

  • 会社 {name, address}
  • 従業員 {firstName, lastName, employer[Company]}
  • アクティビティ{rate, day, employee[Employee], client[Company]}

そして、アクティビティ(モデルの最も複雑なエンティティ)をリクエストすると、次のような結果になります。

{
    links: [],
    content: [{
            rate: 456,
            day: 1366754400000,
            links: [{
                rel: "self",
                href: "http://localhost:8080/api/activities/1"
            },
            {
                rel: "activities.activity.client",
                href: "http://localhost:8080/api/activities/1/client"
            },
            {
                rel: "activities.activity.employee",
                href: "http://localhost:8080/api/activities/1/employee"
            }]
        }]
}

私のAPIは、REST(リンクによって識別されるリソース)の観点から話します。アクティビティには、たとえば従業員がいます。私が本当に使いたいのは、{rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}

ただし、最初の出力からわかるように、私のアクティビティには、従業員へのlinkのみが含まれ、データは含まれていません。 Angularまたはそれらのリンクを解決し、代わりに結果のデータを埋め込むサードパーティライブラリに何かありますか?

これに関する任意の入力?

前もって感謝します!

31
Rolf

チェックアウト angular-hateoas 。 HATEOAS対応の$ resourceを使用するためのAngularJSモジュールですREST API。

20
Farm

返されたオブジェクトを検査し、リンクを確認し、応答を返す前にそれらを解決する応答変換を記述できます。 $ http service documentation のセクション「リクエストとレスポンスの変換」を参照してください。

このようなもの:

transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}

「リンクの解決」ステップ自体が$ http呼び出しであるため、サブ参照も解決されます。ただし、これらは非同期であるため、実際の値の代わりにpromiseを返す可能性があります。変換関数がこれを実行できるかどうかはわかりません。

ただし、@ charlietflが指摘したように、これにより、単一のエンティティを返す複数のHTTP呼び出しが発生することに注意してください。私はHATEOASのコンセプトが好きですが、あまりにも多くの呼び出しが行われる場合、これはおそらく遅くなるでしょう。私はあなたのサーバーがデータまたはその一部を直接返し、さらに詳細についてはリンクを返すことをお勧めします。

7
st.never

私のプロジェクトの1つに angular-hal を使用しています。これはSpring HATEOASバックエンドでした。そして、私はどんな問題にも遭遇しませんでした。パラメータ化されたリソースを処理します。 HALのみをサポートしているのではないかと思います。SpringData Restを使用しているので、HAL準拠の応答を生成するように構成する必要があります。

2
user3408654

クライアントのリンクに対してデータを操作したいというあなたのコメントに基づいて、私は Restangular が適していると思います。

2
Pankaj Tandon

私が混乱しているのは、Angularソリューションで、Spring Dataがより完全なJSON応答を送信することを本当に望んでいる場合に、ソリューションを求めているということかもしれません。クライアントに追加の手順を実行して検索させるのではなく、応答JSONの一部として従業員データを返すようにします。SpringDataでどのデータストアを使用しているかはわかりませんが、一般的な解決策はpublic getEmployeeを追加することです()メソッドをActivityクラスに追加し、@ RelatedToと@Fetchでメソッドに注釈を付けます(これはNeo4Jの設定になります-Spring Dataのフレーバーでは異なる注釈になる可能性があります)。これにより、Spring HATEOASにEmployeeレコードが含まれます。/activityの応答内。これが役立つことを願っています。

0
Adam Policky