2012-03-07 6 views
2

私はAPIを構築しており、リソースの投稿と更新に対処する最善の方法で苦労しています。現時点では、ユーザーはXMLを使用して製品リソースにデータを送信します。このXMLをxsdファイルに対して検証します。これは素晴らしいですが、1つのフィールドを更新したいユーザーは、製品に関するすべてのフィールドを投稿する必要があります。これは期待されているのですか?ビルドRESTful API - POSTリクエストと検証の処理

"ステータス"または "ディスパッチ"アップデートが必要ですが、どちらか一方だけを更新すると同時に決して更新しないリソースがあります。したがって、私は製品リソースを持っているのと同じ方法でこれを構築し、1つしか更新されない場合や、2つの別々のリソースとしてこれらのフィールドを常にPOSTすることを要求しますか?

答えて

2

別の方法で更新を処理できます。最初の質問は、リソースを更新する方法をクライアントがどのように知っているかです。帯域外の情報を受け取っている場合は、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を指定して、その既存の値にnamedescriptionデフォルトた後、全体のリソースが更新されます。私たちがする必要があるのは、私たちのメディアタイプでこのロジックを明確に定義することだけです。

あなたが説明したものから、あなたは現在、なぜならあなた」これは、それ吸う種類-のちょうどアップデートごとの言う悪いわけではない

<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> 

(顧客や従業員の観点から)異なる状態(顧客や従業員の観点から)に送出されますパーミッションに基づいて異なるユーザーにトランジションが提示されます。従業員は注文をキャンセルすることはできず、同様に顧客は注文を処理または発送することができません。また、注文の現在の状態に応じて、許可された状態遷移のみが表示されます。

+0

それは私が始めた方法とはまったく異なり、これについて再考する必要があります。ヘルプとサンプルをありがとうございました。 – LeeTee

1

POSTを使用すると、特定のリソースに対してどのような状態を柔軟に定義できますか。 POSTは一種のキャッチオールメソッドである可能性があります。 PUTメソッドを使用していた場合は、HTTP仕様でこれが正しい動作として定義されているため、リソース状態全体を置き換える必要があります。ステータス用に個別のリソースを作成し、独自のGET/POST/PUT/DELETEビヘイビアでディスパッチして、記述しているユースケースを表現することは実際には意味があります。

+0

だから私はそれを正しくしていますか? – LeeTee

+0

はい、これらのフィールドの実際の使用に適しているので、私は2つの別個のリソースルートに行きます。 –

関連する問題