10

私はRESTアーキテクチャ設計に不慣れですが、その基本はカバーされていると思います。

RESTful呼び出しからオブジェクトを返すことに問題があります。http:// localhost / {type A} / {id}などのリクエストを行うと、指定されたIDを持つデータベースからAのインスタンスが返されます。

私の質問は、AにBオブジェクトのコレクションが含まれているとどうなるかということです。現時点では、私が生成するXMLは、その中にBオブジェクトのコレクションを含むAを返します。BタイプにCオブジェクトのコレクションがある場合、ご想像のとおり、返されるXMLは非常に複雑なオブジェクトグラフになります。

100%確信は持てませんが、これはRESTfulの原則に反しているように感じます。AのXMLは、AのフィールドなどとURIのコレクションを所有するBのコレクションに返す必要があります。

これが少し紛らわしい場合は申し訳ありませんが、私はもっと詳しく説明することを試みることができます。これは比較的基本的な質問のように思えますが、どちらのアプローチが「より」RESTfulであるかを判断することはできません。

乾杯、

アイドス

4

3 に答える 3

10

RESTfulの基本原則の1つは、すべてにURIがあるということです。

あなたはこのようなURIを持っています。

  • /A/および/A/ id /を使用して、Aと特定のAのリストを取得します。A応答には、BのIDが含まれます。
  • /B/および/B/ id /を使用して、Bと特定のBのリストを取得します。B応答には、CのIDが含まれます。
  • /C/および/C/ id /を使用して、Cと特定のCのリストを取得します。

一連のクエリを通じて、ABC構造を再構築できます。Aを取得してから、関連するBを取得します。Bを取得すると、参照されるさまざまなCを取得します。


編集

これ以上戻ることを妨げるものは何もありません。

たとえば、次の種類のURIがあるとします。

  • /flat/A/id//flat/B/id/および/flat/C/id/「フラット」(つまり、深さのない)構造を返します。

  • /deep/A/id//deep/B/id/および/deep/C/id/完全な深さの構造を返すため。

これ/deep/A/id/は、大きなネストされたXMLドキュメントの構造全体になります。それを処理できるクライアントには問題ありません。 /flat/A/id/フラットドキュメントのトップレベルになります。深さを処理できないクライアントに最適です。

于 2008-12-23T02:41:26.593 に答える
5

REST インターフェースがリレーショナルにならないということはありません。

  1. /bookstore/ {bookstoreID}
  2. /bookstore/ {bookstoreID} /本
  3. /本/ {本ID}

基本的に、DB スキーマとは 1 対 1 で対応します。

子リストを形成する多対多の関係を除きます。たとえば、/bookstore/657/books は書籍 ID または URL のリストを返す必要があります。次に、特定の書籍のデータが必要な場合は、3 番目の URL を呼び出すことができます。

これは私の頭の中から外れているだけです。メリットについて議論してください。

于 2008-12-23T01:54:22.490 に答える
-1

あなたが世界にさらす平らな宇宙を作りなさい。

階層オブジェクトグラフをあらゆる深さまで簡単に処理できるSOAPを使用する場合でも、グラフをフラット化し、すべてを単純なIDにリンクします(データベースIDを使用することもできますが、必要がないという考えです。 PKを世界に公開します)。

アプリ内のオブジェクトユニバースは、必ずしも世界に公開するものと同じではありません。Aに子を持たせ、Bに子を持たせますが、RESTリクエストURLにそれを反映する必要はありません。

なぜ平らにするのですか?そうすれば、後でIDでオブジェクトをフェッチしたり、バーストで送信したりできるからです(どちらも同じ場合、多かれ少なかれ)...そしてそれ以上に、オブジェクト階層が変更されてもリクエストURIは変更されません。 (オブジェクト37252は、再分類された場合でも常に同じです)。

編集:まあ、あなたはそれを求めました...これが私が使用することになったアーキテクチャです:パッケージ:サーバー-フロントエンドサーバーとバックエンドサーバーの間で共有されるスーパークラスが含まれています

パッケージ:frontEndServer-フロントエンドサーバーが準拠する必要のあるサーバーインターフェイスが含まれています。SOAPからストレートWebクライアント(JSONなども使用)に変更する場合は、インターフェイスがすべてレイアウトされているため、インターフェイスは優れています。また、クライアントにトスされるフロントエンドクラスのすべての実装と、クライアントとの通信方法を除く、クラス間の相互作用のすべてのロジックが含まれています。

パッケージ:backEndServer-バックエンドサーバーが準拠するサーバーインターフェイスが含まれています。サーバー実装の例は、MySqlDBと通信するものまたはXMLDBと通信するものですが、サーバーインターフェイスはニュートラルです。このパッケージには、サーバーインターフェイスの実装が作業を実行するために使用するすべてのクラスと、永続性を除くバックエンドのすべてのロジックも含まれています。

次に、これらのそれぞれの実装パッケージがあります...これには、バックエンドで永続化する方法やフロントエンドでクライアントと通信する方法などが含まれます。たとえば、フロントエンド実装パッケージは、ユーザーがログインしたことを認識しているのに対し、frontEndServerは、ユーザーを作成してログインするためのメソッドを実装する必要があることを認識しているだけです。

これを書き始めた後、私はすべてを説明するのにもう少し時間がかかることに気づきました、しかしここにあなたはそれの要点を持っています。

于 2008-12-23T06:29:03.420 に答える