3

社内で内部データ用のHATEOASAPIを設計していますが、リンクの検出に問題があります。誰かがこのシステムの特定の従業員に関する情報を取得するための次の一連の手順を検討してください。

  1. ユーザーはGETを送信して、使用可能なすべてのリソースを取得し、rel=" "http://coredata/としてタグ付けされたリンクを含む多数のリンクを返します。http://coredata/rels/employees
  2. ユーザーは最初のリクエストからrelでHREFをフォローし、(たとえば)でGETを実行します。http://coredata/employees

この最後の呼び出しから返されたデータは、私の難問であり、さまざまな提案を聞いた状況です。それらのいくつかを次に示します。

  1. そのGETはすべての従業員(おそらく切り捨てられたデータを含む)を返し、クライアントはそのリストから必要な従業員を選択する責任があります。
  2. そのGETは、クエリを実行する方法/1人の従業員を取得する方法/すべての従業員を取得する方法を説明するいくつかのURIテンプレートリンクを返します。何かのようなもの:

    "_links": {
        "http://coredata/rels/employees#RetrieveOne": {
            "href": "http://coredata/employees/{id}"
        },
        "http://coredata/rels/employees#Query": {
            "href": "http://coredata/employees{?login,firstName,lastName}"
        },
        "http://coredata/rels/employees#All": {
            "href": "http://coredata/employees/all"
        }
    }
    

私はここでHATEOASに最も近いものに少し立ち往生しています。オプション1の場合、ナビゲーションのためにクライアントに毎回すべての従業員を取得させたくはありませんが、例2のURIテンプレートを使用すると、帯域外の知識がどのように導入されるかがわかります

私の他の考えは、RetrieveOne、Query、およびAll操作をクールなURLとして使用することでしたが、これは、1つのベースURIから必要なリソースにナビゲートできるはずであるという概念に違反しているようです。

他の誰かがこれを処理するための良い方法を思いついたことがありますか?1つのリソースまたは一連のリソースを取得すると、ナビゲーションは非常に簡単になりますが、検出に使用するのは非常に難しいようです。

4

3 に答える 3

3

オプション 2 は、 RFC 6570を使用して URI パターンを特徴付けているため、それほど悪くはありません。HATEOAS は通常、クライアントに URI を合成させないという点で述べられていますが、サーバーが URI テンプレートを保証し、それを標準形式でクライアントに明示的に伝える準備ができている場合、それは受け入れられます。(「すべての従業員を一覧表示する」URL にはall、その ID を持つ従業員と区別するために、接尾辞を付けないようにしたいと思います。クライアントは、原則として、従業員 ID がどのように見えるかを知っているべきではありません。)

実際、主な問題は、クライアントがこれらのタグ URI の意味を理解する必要があることです。「<code>http://coredata/rels/employees#All」が「すべての従業員のリスト」を意味することを推測する実際の方法はありません。そこで、クライアントに知識を埋め込んだり、セマンティック ラベル付けを行ったりしますが、HATEOAS は実際にはこれらのことには対応していません。

于 2012-11-25T12:16:50.467 に答える
0

私の HATEOAS API は、あなたが使用しているように HTML とHAL+JSONを返します。どちらも同じ URI を使用するため、私の JSON 応答は、人間の Web ユーザーが見るものを単純に返します (きれいな色をすべて差し引いたもの)。例えば

GET /


{"_links": {
    "http://coredata/companies": { "href": "/companies?page=1" }
    ...
}}



GET /companies?page=1


{"_links": {
    "next": { "href": "?page=2" }
    ...
}}
于 2012-11-25T11:02:18.430 に答える