問題タブ [hypermedia]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
api - 同じ rel を持つリンクの HAL+JSON 表現
HAL仕様には次のように書かれています:
注: リンクが単数形であるかどうかわからない場合は、複数形であると想定してください。単数形を選択して変更する必要がある場合は、新しいリンク関係を作成するか、既存のクライアントを壊す必要があります。
特定の rel の単数または複数とのリンクの作成は、特定のリソース表現内でのその rel の使用にのみ適用されますか、それとも任意のリソース表現でのその rel の使用に適用されますか?
たとえば、item
rel の下のリンクはリソース X 内で常に複数でなければならないと決めた場合、その制約はリソース X にのみ適用されますか、それともリソース Y にも適用item
されるのでしょうか?
api - RESTハイパーメディアAPIで交差点を構築する方法は?
この質問は言語に依存しません。フレームワークや実装について心配する必要はありません。すべてを実装できるとだけ言って、REST API を抽象的に見てみましょう。言い換えれば、私は現在フレームワークを構築していますが、この問題の解決策はどこにもありませんでした。
質問
コレクションを返す 2 つの独立した REST パスが交差する REST URL エンドポイントを構築するにはどうすればよいでしょうか? /users/1/comments
簡単な例:とを交差させる方法は/companies/6/comments
?
制約
すべてのエンドポイントは、単一のデータ モデル エンティティまたはエンティティのコレクションを返す必要があります。
これは非常に合理的な制約であり、ハイパーメディア API のすべての例は、draft-kelly-json-hal-07であってもこのようになります。
これが無効な制約であると思われる場合、またはより良い方法を知っている場合は、お知らせください。
例
と の 3 つのデータ型を持つアプリケーションがあるproducts
とcategories
しcompanies
ます。各企業は、プロファイル ページにいくつかの製品を追加できます。製品を追加する際、製品にカテゴリを添付する必要があります。たとえば、この種のデータには次のようにアクセスできます。
GET /categories
すべてのカテゴリのコレクションを返しますGET /categories/9
ID 9 のカテゴリを返しますGET /categories/9/products
ID 9 のカテゴリ内のすべての製品を返しますGET /companies/7/products
ID 7 の会社のプロファイル ページに追加されたすべての製品を返します。
_links
ハイパーメディアの部分は簡単なので、意図的に/
省略_links
しまし/categories
た/companies
。
返される URL の書き方: 会社 (7) のすべての製品とカテゴリ (9) の製品は? 言い換えれば、どのように交差する/categories/9/products
の/companies/7/products
ですか?
すべてのエンドポイントがデータ モデル リソースまたはそれらのコレクションを表す必要があると仮定すると、これは REST ハイパーメディア API の根本的な問題であると考えられます。 2 つの独立したグラフ パスの断面。
つまり、1 つのパスだけで 2 つの独立したパスを表すことはできないと思います。通常は のような 1 つのパスをトラバースしますA->B->C
がX->Y
、 and があり、そこから来るZ->Y
すべての が必要な場合、問題が発生します。Y
X
Z
これまでのところ、私の提案はクエリ文字列を使用する/categories/9/products?intersect=/companies/9
ことですが、もっとうまくやれるでしょうか?
なぜ私はこれが欲しいのですか?
SQL データベースの関係に基づいて REST ハイパーメディア API を自動生成するフレームワークを構築しているためです。URL からクエリへのトランス コンパイラと考えることができますSELECT ... JOIN ... WHERE
が、API のクライアントは Hypermedia しか認識せず、クライアントは例のように交差を行う適切な方法を望んでいます。
rest - 既存の Web API の特定の HTTP エラー応答で提案として URI リソースを提供する合理的な方法は何ですか?
HAL、UBER、Collection+JSON などの一般的なハイパーメディア形式のいくつかを認識しており、これらの値に価値があることを認識していますが、既存の HTTP ベースの API は、それを行うための合理的な方法は何でしょうか? 私はむしろ、標準に似ていないものを自分で作成したくはありませんが、その一方で、その時点で API を覆すことは考えていません。さらに、いくつかの一般的なハイパーメディア形式の詳細をざっと調べたところ、エラー ケースに関連する相対リンクを提示する方法を具体的に示唆する例は見当たりません。
私がサポートしたいユースケースの例は、/documents/vehical-listing 形式の URL への POST への応答に沿ったもので、リスティングに所有者のプロパティがありませんでした。 /vehical-owners などの URL を使用して、登録済みの所有者を参照する必要がある vehical-listing を POST しようとする前に、所有者情報をどこに POST するかを知ることができます。
django - カスタム ハイパーリンク フィールドに追加の URL 変数を含め、すべての ModelViewSet で機能するようにするにはどうすればよいですか?
Django REST Frameworkのドキュメントにあるセットアップと同じ、API URL のベースで変数を使用します。
ベース ブランド スラッグの後の部分はすべて標準の API 形式であるため、ModelViewSets を使用して、オブジェクトのすべてのリスト ビューと詳細ビューを生成します。API 内のすべてがブランドによってフィルタリングされるため、この設定は理にかなっています。
簡略化されたプロジェクト/urls.py
簡略化された api/urls.py
また、すべてのモデルのハイパーメディア リンクも必要ですが、ここで問題が発生しました。REST フレームワークは、このブランド変数を取得し、それを使用して正しいリンクを生成する方法を知りません。ドキュメントに従ってこの問題を解決しようとすると、2 つの後退が生じます。
- ドキュメントは HyperlinkRelatedField クラスを上書きする方法を説明していますが、シリアライザーで動作するようにそのクラスをどこに置くべきかは決して述べていません。
- ブランド変数を URL から HyperlinkRelatedField クラスに実際に取得する方法については言及されていません。
ここに欠けている要素は何ですか?
rest - HAL、JSONAPI、Collection+json、odata その他のハイパーメディアの長所と短所
安らかなAPIに利用できるハイパーメディアはたくさんあります。どちらがどのケースに適しているかわかりません。安らかなAPIの私の最初の試みなので、それを使用することの問題と利点を予測することはできません. 私が欲しいのは、クエリを実行できるものと、バッチ サポート (特に GET 要求の場合) があることです。
Odata は完全な機能であり、オアシスの標準でもあるようですが、私にはやり過ぎのように思えます。そのクエリ機能は柔軟ですが、複雑です。さらに、odata 4のphp実装はありません。それを使用する場合は、自分で行う必要があります。私が今避けようとしているもの。
Hal 単純すぎて何もできないようです。
Collection+json は良さそうです。しかし、バッチ操作機能はないようです
jsonapi: シンプルに見えます。クエリ機能とバッチ操作 (拡張機能あり) の両方を備えています。ただし、GET リクエストの一括操作には対応していません。状態も安定しています。しかし、私はまだそれのレビューを見つけることができません。
これに関するあなたの経験は何ですか?それらの中からハイパーメディアをどのように選択すればよいですか? どんな洞察も役に立ちます。これ以外のハイパーメディアも聞きたいです。
現在、json-api と collection+json の間で混乱しています。
rest - JSONAPI はどのようにタイプ/ID をナビゲート可能な URL に変換しますか?
JSONAPI 仕様では、Resource Objects の下に、次のリソースの例が示されています。
リソース インクルージョンを使用していない場合、クライアントは以下に含まれる情報をどのように処理する必要がありますか。
article
応答にはの作成者 ( )へのリンクが含まれています。この応答の要素を/articles/1/author
読むと、この記事の作成者が の人物であることがわかりますが、実際にはその情報を使用して役立つことは何もできません。data { ... }
id=9
この情報を使用して GET リクエストを作成し、作成者の詳細を取得できることは直感的に思え/people/9
ますが、それは JSONAPI 仕様の一部ではないようです (ただし、リソース コレクションの URL に関しては、これらの線に沿った推奨事項があります)。
インラインtype/id
情報は、リソースの包含または以前にキャッシュされた応答データとの相互参照のいずれかのコンテキストでのみ関連していますか? type+id
または、リソース URL () への変換に関する文書化されていない規則はありますGET /{type}/{id}
か?
java - Java のバインディング機能を備えたシンプルなテンプレート ライブラリ
テンプレート エンジンを使用して有効な JSON を生成したいと考えています。特に、テンプレート内のプレースホルダーをモデル クラスのプロパティに置き換えるエンジンが必要です。エンジンは、 のような複雑なクラスの使用コンバーターを許可する必要がありますjava.util.Date
。さらに、テンプレート自体でリストを明示的に処理したくはありません。代わりに、コレクションのような型で有効な JSON 配列を生成する必要があります。
これはテンプレートの例です。
$relations
このテンプレートの変数 ( 、$firstname
、$lastname
) を、リレーション、名、姓のプロパティを持つモデルから置き換えたいと考えています。これは、ネストされたプロパティでも機能するはずです。(例: $address.street
)
モデルをバインドすると、JSON は次のようになります。
エンジンは、必要に応じて引用符を使用する必要があることに注意してください。
これを行うことができるテンプレート ライブラリはありますか、それとも独自のライブラリを展開する必要がありますか?
私はすでに次のライブラリを調べました:
- フリーマーカー
- 速度
- 文字列テンプレート
また、いくつかのスレッドも読みました。
しかし、今のところ満足のいく解決策は見つかりませんでした。
背景情報:
Uberdata
は、データをエンコードするために要素をネストする、ドメインに依存しないハイパーメディア形式です。多くのオブジェクトを作成し、セッターを介してそれらをネストする必要があるため、Jackson のようなライブラリでシリアル化する場合、この形式を作成するのは非常に面倒です。
そのため、テンプレートを使用して出力を生成し、ユーザーがテンプレートを作成し、後でモデルをこのテンプレートにバインドして出力を生成できるようにすることを考えました。
hateoas - 春のHATEOAS with Traverson
私はspring-hateoas:0.18.0.RELEASEとspring-boot:1.2.5.RELEASEを使用しています
Web サービスを呼び出してHALリンクを通過するために、 Traverson Client (Traverson JavaScript ライブラリに触発されたクライアント側サービス トラバーサル用 API) を使用しています。
Spring Hateoas Traverson ドキュメント
HypermediaとHateoasRestを操作するための新しい機能です。
私の質問は、いつPagedResourcesとResourceを使用する必要があるかということです。
ここで見つけた例 Traverson Client examples :
私が書いたコードは次のとおりです。
同じではないことはわかっていますが、 Traverson.toObject()メソッドを呼び出すときのリソースのベスト プラクティスは何ですか?