3

事前に: ハイパーメディアまたは Restfull の概念を誤解していたら申し訳ありません: 進行中の作業です...)

ハイパーメディアとヒドラ ( http://www.markus-lanthaler.com/hydra )を理解しようとしていますが、API を設計する前にクライアントに情報を返すことについていくつか質問があります。

www.myshop.com にウェブショップがあるとします。

ルートへの HTTP GET は、(たとえば) リンクとして表されるリソースのリストを返すことができます (json-ld ドキュメント内):

...
"@id": "/api",
"products" : "www.myshop.com/api/products",
"customers":"www.myshop.com/api/customers"
...

ヒドラに関する最初の質問です。ここにアクションを追加するにはどうすればよいですか? アプリケーションをロードする前に、クライアントが別のドキュメントをロードする必要があるようです。www.myshop.com/api から取得したドキュメントに潜在的なアクションが含まれていないことを意味します。


さらに進んで、productsは hydra:Link であると述べたので、クライアントは HTTP GET でそのリンクをたどって (対話して)、製品のリストを取得できます。それは次のようなリストになります:

....
{
  "@id": "/api/products/123",
  "@type": "vocab:Product"
},
{
  "@id": "/api/products/124",
  "@type": "vocab:Product"
},
....

ここで、クライアントは製品のリストを受け取ります (ページ化されたコレクションである可能性があります)。しかし、クライアントがそれをユーザーに表示したい場合は、 [製品 ID、価格、名前] (すべての製品のプロパティではない)を持つテーブルを考えてみましょう。

2番目の質問:クライアントが各製品のサーバーにリクエストを送信せずに、製品の詳細情報を取得するためのリンクを提供するにはどうすればよいですか?削除して、友人と共有するために 1 つ、バスケットに追加するために最後の 1 つ) ?

実際、ドキュメント自体にリンクが含まれていないため、ヒドラがどのように機能するのかを理解するのは困難ですか? Hal はこのアプローチを使用して、ドキュメント自体にリンクを作成していると思います (私が正しい場合)。

よろしく

4

2 に答える 2

2

注:答えのHydraの部分はよくわかりません。JSON-LDとRESTは大丈夫だと思います。

JSON-LD で相対 IRIを使用@baseしたり、 で名前空間を定義したりできる@contextので、その後は相対 IRI を として使用できますns:relativeIRI。それぞれが完全な IRI を返すよりも優れています。(単純な JSON パーサーではなく、クライアント側で一般的な JSON-LD パーサーを使用して結果を解析する方が簡単です。)

@vocabHydra vocab を使用して独自に定義するか、 @context. 「アクションを追加」したい場合hydra:Operationは、語彙でサブクラスを使用する必要があります。このようなもの (ただし、私は Hydra の専門家ではありません):

{
    "@id": "vocab:ProductList",
    //...
    "hydra:supportedOperations": [
        {
            "@type": "hydra:CreateResourceOperation",
            "method": "POST",
            "expects": "vocab:Product"
        }
        //...
    ]
}

通常、REST では、プロパティが少ない同じリソースが必要な場合は、そのリソースに新しい IRI を追加する必要があります/myresource?fewer=1。たとえば、あなたの場合:/api/products/?fields="id, price, name"大丈夫です。

Hydra では、複数のリンクが必要な場合は 2 つの選択肢があります。newhydra:Linkをプロパティとして追加することも、 newをwithhydra:Operationとして追加することもできます。get 操作は、ユーザー入力がある検索のようなものだと思いますが、リンクごとに新しいプロパティを追加したくない場合は、他に選択肢がないと思います。supportedOperationmethod: GET

実際、Hydra にはリンクと操作のサポートがあります。明確ではないかもしれませんが、JSON-LD は RDF 形式です。その中で RDF トリプルを定義できます。したがって、たとえば by で使用した IRI"customers":"www.myshop.com/api/customers"は単なるリソース識別子であり、リンクではありません。リンクには、IRI、タイトル、メソッド (GET)、言語、コンテンツ タイプ、iana:relation などを含める必要があります。したがって、1 つの IRI (リソース識別子) だけでたどることができるリンクを記述することはできません。REST リソースを処理することにより、クライアントは IRI 構造をチェックして、取得したものを表示する方法を知る必要はありません。リンクの他のプロパティ、特にiana:relationsまたは Hydra 操作タイプを確認して、それを行う必要があります。たとえば、あなたの場合www.myshop.com/api/dav8ufg723udvbquacvd723fudvg顧客のリストに対して完全に有効な IRI です。サーバー側で IRI を生成し、ルーターを構成する方が簡単なため、Nice IRI を使用します。

さらに質問する前に、ヒドラ語彙を確認してください。ご覧のとおり、Class持つことができsupportedOperationssupportedPropertiesどちらもコレクションです。ALinkProperty、単一の を持つことができるサブクラスOperationです。Collectionコレクションでは、コレクションのアイテムを含むクラスを使用する必要があると思いますmember... JSON-LD では、同じタイプの単一のアイテムまたは複数のアイテムを定義しても違いがないことに注意してください。コンテキストでは、タイプのみを定義する必要があり、プロパティの値には単一のアイテムまたはアイテムの配列の両方を含めることができます...それについていくつかの制約が必要な場合は、いくつかのOWLトリプルを追加する必要があると思います.それらを使用して値をチェックするバリデーター。

于 2014-08-23T10:14:28.967 に答える