2

私は多くのリソース用にRESTAPIを設計していますが、公開するデータの量だけが異なる同じ形式(JSONなど)の表現を少なくとも2つ維持する必要があります。

たとえば、RESTを介して公開している本、出版社、著者がいます。したがって、リソースの3つのコレクションがあります: books、、。本をリクエストするときは、著者と出版社に関する最小限の情報(名前、ID、完全な表現へのハイパーリンク)を含めるようにします。publishersauthors

GET /books/12345
200 OK
{
    id: "12345",
    title: "My Book",
    authors: [
        {id:"111", name:"J. Smith", _href:"/authors/111"},
        {id:"222", name:"J.R.R. Tolkien", _href:"/authors/222"}
    ],
    publisher: {id:"333", name:"HarperCollins", _href:"/publishers/333"},
}

ユーザーがリクエストした場合、たとえば/publishers/333、名前とIDだけでなく、それに関する詳細情報を取得する必要があります。

{
    id: "333",
    name: "HarperCollins",
    address : { ... },
    contact : { ... },
    logo : { ... }
}

私のアプリケーションには、3つのクラス、、BookPublisherあります。AuthorここにBookは、発行者と作成者のコレクションが含まれています。そして、JacksonとSpring MVCを使用して、RESTAPIを介してすべてのエンティティをJSONとして公開しています。

@RequestMapping("/books/{id}")
@ResponseBody
public Book getBook(String id) {
    return getBookById(id);
}

@RequestMapping("/authors/{id}")
@ResponseBody
public Book getAuthor(String id) {
    return getAuthorById(id);
}

今の質問:

  • どの場合、どのオブジェクトのどのフィールドをレンダリングする必要があるかをビューに伝えるにはどうすればよいですか?
  • 代わりに、各エンティティを2つに分割する必要があります。1つは短いもので、もう1つは完全な表現です(たとえばAuthorReference、and AuthorPublisherReferenceand Publisher)。
  • オプション#2を使用する場合、構成または一般化を優先する必要がありますか?
  • RESTアプリケーションで同じエンティティ表現のさまざまな詳細化を処理するためのベストプラクティスはありますか?
4

2 に答える 2

2

HALなどのより標準的なハイパーメディア形式の使用を検討しましたか?

そうすることで、リソースと他のリソースへのリンクに違いがあることがかなり明らかになります。たとえば、次のようになります。

GET /books/123
200 OK
{
  "id": "123"
  "title": "My Book"
  "_links": {
     "author": [
       { "href": "/authors/111", "title": "J. Smith" },
       { "href": "/authors/321", "title": "Jules Verne" }
     ],
     "publisher": { "href": "/publishers/123", "title": "Harper Collins" }
  }
}

実装に関しては、次のいずれかを実行できます。

  1. 次のように、リソース表現ごとにカスタムDTOクラスを作成します。

     public class BookDto {
         @JsonProperty(value="_links")
         public LinkCollection getLinks() { }
    
         public String getTitle() { }
     }
    
  2. 同じクラスを使用しますが、Jacksonがシリアル化する前にフィルターを使用してオブジェクトを変更し、@ JsonProperty /@JsonIgnoreの組み合わせを使用します。

于 2013-03-26T15:39:43.637 に答える
0

1 / Spring MVCのドキュメントによると、HTTPを介してオブジェクトをシリアル化するには、、またはのいずれかを使用して実装する独自のクラスを定義する必要がありHttpMessageConverter<T>ます。 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/remoting.html#rest-message-conversionTBookPublisherAuthor

2/オブジェクトを2つに分割する必要はありません。から取得するフィールドを選択するロジックは、Authorに含まれていAuthorToHttp implement HttpMessageConverter<Author>ます。AuthorReferenceToHttp implement HttpMessageConverter<Author>HTTP経由で送信するデータを少なくしたい場合に使用するを開発する必要があります。

別の解決策は、AuthorReference extend AuthorまたはAuthor extend AuthorReference一方でAuthorToHttp implement HttpMessageConverter<Author>AuthorReferenceToHttp implement HttpMessageConverter<AuthorReference>、をシリアル化することAuthorです。

3/継承/一般化で十分です。必ずしもパターンの必要はありません。

コンポジットは間違った選択です。ツリー構造は必要ありません。状況に応じて、作成者に関するすべてのデータ(デフォルトの動作)、または作成者に関するメインデータ(「プロキシされた」動作)のいずれかが必要になります。プロキシの方が適しています。

4/わからない。

于 2013-03-26T20:29:53.577 に答える