2017-11-24 7 views
0

HALでのPOSTリンクの記述方法を教えてください。HATEでのHATEOAS POSTリンク

私はWikipedia's HATEOAS exampleに似HATEOAS制約を持つRESTfulなAPIを設計するが、HAL JSON(明確にするためのスキーム、ホスト、などをドロップ)で表されている:「転送」アクションを実行するには

GET /accounts/12345 

{ 
    "id" : 12345, 
    "balance" : 100.00 
    "_links" : { 
    "self" : { 
     "href" : "/accounts/12345" 
    }, 
    "transfer" : { 
     "href" : "/accounts/12345/transfer{?amount,target}", 
     "templated" : true 
    } 
    } 
} 

クライアントはおそらく次のようになります:

GET /accounts/12345/transfer?amount=100.00,target=54321 

{ 
    "id" : 34567, 
    "amount" : 100.00 
    "_links" : { 
    "self" : { 
     "href" : "/transfers/34567" 
    }, 
    "source" : { 
     "href" : "/account/12345" 
    }, 
    "target" : { 
     "href" : "/account/54321" 
    } 
    } 
} 

"transfer"リンクをGETで呼び出すと、 "transfers"に新しいressourceが作成されます。しかし、新しいリソースを作成するためにGETを実行することは、冪等ではなく、「間違っている」と感じます。 RESTfulなリソース中心のAPIはPOSTになります。

POST {amount: 10.00, source: 12345, target: 54321} /transfers/ 

{ 
    "id" : 34567, 
    "amount" : 100.00 
    "_links" : { 
    "self" : { 
     "href" : "/transfers/34567" 
    }, 
    "source" : { 
     "href" : "/account/12345" 
    }, 
    "target" : { 
     "href" : "/account/54321" 
    } 
    } 
} 

しかし、どのように私はこのPOSTを説明し、HALで必要なフォーム要素ですので、クライアントは、単にハードコード化されたされずに「正しいこと」を行うことができますか?おそらくのようなもの:

{ 
    "id" : 12345, 
    "balance" : 100.00 
    "_links" : { 
    "self" : { 
     "href" : "/accounts/12345" 
    }, 
    "transfer" : { 
     "href" : "/transfers{?amount,source,target}", 
     "templated" : true, 
     "method" : "POST" 
    } 
    } 
} 

しかしmethodないHAL specificationの一部と全く類似した識別子がありません - 私は間違ってトラックにだようにそれは感じている...

おそらく、私のクライアントは単に「知っておくべきことtransferのGETは一致する転送リソースを返し、transferのPOSTは新しい転送リソースを作成します。

FWIW、フォローアップの質問が春HATEOASでこれを表現する方法であるので、私の実装では、春のHATEOASで春ブーツ2を使用しています...

答えて

2

あなたはHALであることを行うことはできません。マイク・ケリー、HALの生みの親、states on GitHub

これを行うの「HALの方法は、」人間が読める形式で利用可能な方法を伝えるためにリンクRELのマニュアルを使用することです。すなわち、次のようになり、あなたの樹皮の例

{ 
    "_links": { 
     "http://docs.example.com/barks": { "href": "/v1/dogs/1/barks" } 
    } 
} 

(「樹皮」リンクREL通知がURLになりました)と、開発者がブラウザにURL http://docs.example.com/barksをフェッチした場合、ドキュメントが利用可能な方法、有効なリクエストボディを指定することができます潜在的なレスポンスコード、レスポンスボディなどが含まれます。開発者は、これをビルドしているクライアントにコード化します。

これはHAL仕様私見の大きな欠陥であるが、MasonまたはHAL拡張HAL-FORMSのように、この問題に取り組む他のmediatypesは、あります。これらをチェックする価値はあるかもしれませんが、私はSpringとどのように統合するのか分かりません。

関連する問題