2011-07-16 18 views
3

私たちのプロジェクトでは、POST構造体またはPUT要求を介して(XML、JSONなどの)構造体を送ることで本を追加できます。例えば、XMLで、本構造は、この(簡体字)のようになります。この本は、私たちのバックエンドデータベースに挿入されるとREST-GETはPOST/PUTと異なる結果を返します

<book> 
    <title>My Book</title> 
    <author>John Q.</author> 
</book> 

、いくつかの自動生成されたプロパティには、ユーザーは、作成日として、自動的に追加されます本を提出したID、識別子、本はGETを通じて取得されると...

、これらの追加プロパティはブックの定義に含まれています。

<book> 
    <title>My Book</title> 
    <author>John Q.</author> 
    <info> 
     <creation_date>2011...</creation_data> 
     <user_id>48</user_id> 
     <identifier>my_book_john_q</identifier> 
    </info> 
</book> 

これは、基本的にそのXMLスキーマを意味し、新しい/編集された本(クライアントからsへerver)は検索された本とは異なります(=サーバーからクライアントへ)。これは物事を混乱させます。

possiblityは、例えば、異なるURIにこれらの追加のプロパティが利用できるようにすることです:

http://server/books/:id/    -> returns the short version 
http://server/books/:id/information/ -> returns the generated properties 

このアプローチの欠点は、2つの個別の要求は、すべてのデータを持っている必要があるということです。

どのようにこの不一致を解決しますか?

答えて

5

これは完全に正常です。サーバーがいくつかの追加情報を使って表現を補完することは問題ありません。これの良い例は、サーバーが表現へのリンクを追加する場合です。 PUTを実行するとき、クライアントがそれらのリンクの「コピー」をサーバーに送信する必要はありません。 GETとPUTのリソース表現は概念的に同じでなければならず、必ずしも同じバイトのバイトである必要はありません。

+0

いいえ。確かに、GETとPUTが概念的にも内容的にも(バイトごとに)同一でなければならないかどうかは不明でした。 –

+0

私は同意する:パターンは私たちに役立つ。私たちはそれらを提供しません。 tl; dr:emerson ところで、このパターンの起源を知っていますか? –

0

あなたは正しくMIMEタイプを使用していません。私はapplication/xmlの一般的なMIMEタイプを使用しており、クライアントはエンドポイントに基づいて何を期待するのかを知っているでしょうか?

あなたの問題に対処する適切な方法は、同じリソースに対して異なるMimetypeを使用して表現することです。たとえば、短い表現にはapplication/vnd.yourcompany.book.short+xml、完全表現にはapplication/vnd.yourcompany.book+xmlを使用できます。クライアントは、Content-Typeヘッダーを使用して、どちらが送信しているかを伝え、Acceptヘッダーを使用してどちらを送信するかを指定できます。

これは、クライアントがPOSTまたはPUTで短い表現を送信する必要があることを意味しません。オプションとしていくつかのフィールドを文書化することができ、クライアントがそれらを省略することはまったく問題ありません。

関連する問題