別の方法で更新を処理できます。最初の質問は、リソースを更新する方法をクライアントがどのように知っているかです。帯域外の情報を受け取っている場合は、RESTを実行していません。バンド内の更新情報を含めることで、明示的に更新する方法を提供し、それによってより大きな自由と柔軟性を提供します。例えば、product
リソースは
<product href="/products/123"
name="iPad 64GB + 4G"
price="829.00">
<description>It's cool, ya</description>
<update href="/products/123" method="PUT">
<name type="xs:string" cardinality="optional"/>
<price type="xs:decimal" cardinality="optional"/>
<description type="xs:string" cardinality="optional"/>
</update>
... you could have a delete form here as well ...
</person>
はその間、products
コレクションは、引数のカーディナリティは、更新の間で異なっていて、どのように作成するか
<people href="/products">
... the first set of items in the collection and pagination links could go here ...
<create href="/product" method="POST">
<name type="xs:string" cardinality="required"/>
<price type="xs:decimal" cardinality="required"/>
<description type="xs:string" cardinality="required"/>
</create>
</people>
お知らせとして表すことができ、以下のように表すことができます。全体のリソースの状態を交換PUTの面で
、それをこの方法を考える:私はproduct
を更新してのみprice
を指定して、その既存の値にname
とdescription
デフォルトた後、全体のリソースが更新されます。私たちがする必要があるのは、私たちのメディアタイプでこのロジックを明確に定義することだけです。
あなたが説明したものから、あなたは現在、なぜならあなた」これは、それ吸う種類-のちょうどアップデートごとの言う悪いわけではない
<product href="/products/123"
name="iPad 64GB + 4G"
price="829.00">
<description>It's cool, ya</description>
<update href="/products/123" method="PUT">
<product type="my:product" cardinality="required"/>
</update>
... you could have a delete form here as well ...
</person>
<people href="/products">
... the first set of items in the collection and pagination links could go here ...
<create href="/product" method="POST">
<product type="my:product" cardinality="required"/>
</create>
</people>
の線に沿って表現することができるようなものを持っていますすべてのフィールドを含める必要があります。あなたはこれが間違っていると感じてそれを疑うのが正しいです。
また、要求を検証するためにXSDを使用しないことを強くお勧めします。 XSDが非常に慎重に設計されていない限り、クライアントとAPIの間に緊密な結合が形成され、同時に、または特定の順序(サーバー、クライアントなど)で更新する必要があります。代わりにSchematronを見てください。
さて、どちらかstatus
またはdispatch
詳細を持っていますorder
の面で、少しステートマシンとしてorder
リソースを考えます。
Start ----> Received ----> Processed -------> Dispatched ------> End
| | ^
| V |
----------> Cancelled ------------------------------
したがって、注文が作成されると自動的にステータスが受信済みに設定されます。そこから処理されたかキャンセルされ、処理されたかのいずれかがディスパッチまたはキャンセルされます。アイデアは、リソース内に提供されたフォームとリンクを使って遷移を表現することです。
<order href="/orders/123" status="received">
... order details go here ...
<cancel href="/orders/123" method="delete"/>
</order>
受信(従業員の視点から):
<order href="/orders/123" status="received">
... order details go here ...
<process href="/orders/123" method="put">
... whatever details need to be submitted at the same time ...
</process>
</order>
これに基づき、ここで私たちはさまざまな状態
(顧客の視点から)受信のために、order
を表現することができる方法であります
処理済み(お客様の視点から)
<order href="/orders/123" status="processed">
... order details go here ...
<cancel href="/orders/123" method="delete"/>
</order>
(従業員の視点から)に処理:
<order href="/orders/123" status="processed">
... order details go here ...
<dispatch href="/orders/123" method="POST">
<company type="xs:string" cardinality="required"/>
<con-note type="xs:string" cardinality="required"/>
<tracking type="xs:anyURI" cardinality="optional"/>
... whatever details need to be submitted at the same time ...
</dispatch>
</order>
<order href="/orders/123" status="dispatched">
... order details go here ...
<shipping-details href="/order/123/shipping">
</order>
キャンセル
<order href="/orders/123" status="cancelled">
... order details go here ...
</order>
(顧客や従業員の観点から)異なる状態(顧客や従業員の観点から)に送出されますパーミッションに基づいて異なるユーザーにトランジションが提示されます。従業員は注文をキャンセルすることはできず、同様に顧客は注文を処理または発送することができません。また、注文の現在の状態に応じて、許可された状態遷移のみが表示されます。
それは私が始めた方法とはまったく異なり、これについて再考する必要があります。ヘルプとサンプルをありがとうございました。 – LeeTee