現在のベスト プラクティスは、可能な限り新しいコンテンツ タイプを作成しないことです。
- あなたの聴衆に依存します。彼らが消費しやすいものを使用してください。スキーマを理解できる一般的な自動化されたエージェントですか、それとも API に特化して作業する開発者ですか。とにかく、人間が読めるドキュメントが常に必要になるので、そこから始めます。リクエスト本文を受け入れることを選択した場合
application/x-www-form-urlencoded
、HTML フォームは作業用テンプレートを提供する優れた方法です。
- これは、フィールドの「タイプ」を定義します。したがって
name
、 afoaf:name
は、呼び出されたフィールドname
に type の値が含まれていることを示していますhttp://xmlns.com/foaf/0.1/name
。リソース記述形式である RDF について読み、Turtle や N3 などの表現を調べれば、これがより明確になります。owl:sameAs
リンク関係はやなどの RDF プロパティと同じではありませんが、(単純な文字列ではなく) URI である関係の概念はそこから来ていますfoaf:name
。どちらも有向グラフのエッジとして表されます。
- 詳しく説明してください。フィールドが追加/削除されたということですか、それともまったく異なるコンテンツ タイプですか? 後者は別のリソースであり、別の URI を持つべきだと私は主張します。クライアントは、リソースに加えられる将来の変更を理解するか、無視できる必要があります。
- あなたが提案したすべてのコンテンツ タイプは、この方法で進化できるはずです。それがまさにHATEOASの前提です。
あなたのデザインは、コレクションのリストを含み、それぞれがリーフ リソースのリストを含む、1 つのルート リソースを持つ単純なツリー構造のように見えます。複雑なことは何もないので、ここで何かが欠けているようです。
応募者とは、仕事に応募する人を意味し、アドレスとは、彼らが住んでいる場所または働いている場所 (たとえば、電子メール アドレスとは対照的に) を意味すると仮定します。以下のいくつかは明白かもしれませんが、この質問に出くわす可能性のある他の読者のために含めています.
HAL を使用した実装例は次のようになります。
リクエスト:
GET / HTTP/1.1
Host: example.com
Accept: application/hal+json
応答:
HTTP/1.1 200 OK
{ "_links": {
"self": { "href": "/" },
"http://example.com/docs/applicant": [
{ "href": "/applicant1" },
{ "href": "/applicant2" },
{ "href": "/applicant3" }]
} }
次に、クライアントは関係を持つハイパーリンクを探しますhttp://example.com/docs/applicant
。これは単なる文字列であり、必要にfishmonkeygiraffe
応じて指定できます。文字列を http URL にすることで、クライアントの開発者はドキュメントをより簡単に見つけることができます。一意の文字列: 独自のドメイン。クライアントがその中のハイパーリンク (<LINK> 要素と <A> 要素) を見つける方法を知っている限り、応答形式は HTML などのハイパーテキスト対応形式にすることができます。または、それらを HTTP リンクヘッダーで返すこともできます。ただし、取得したリソースをディスクに書き込む必要がある場合は、クライアントがそれらを格納する必要があります。
次に、クライアントは、見たいものを要求します。
GET /applicant1 HTTP/1.1
Host: example.com
Accept: application/hal+json
応答:
HTTP/1.1 200 OK
{ "_links": {
"self": { "href": "/applicant1" },
"http://example.com/docs/applicant-address": [
{ "href": "/applicant1/address1" },
{ "href": "/applicant1/address2" },
{ "href": "/applicant1/address3" }]
} }
明らかに、「applicant1」は、「applicants/1」や「vacancies/sweet-manager/applicants/dave-smith」など、任意の名前にすることができます。クライアントは、指定された URL に従うだけです。
次にクライアントは、http://example.com/docs/applicant-address
取得するタイプのハイパーリンクを選択します。
GET /applicant1/address1 HTTP/1.1
Host: example.com
Accept: application/hal+json
応答:
HTTP/1.1 200 OK
{ "_links": {
"self": { "href": "/applicant1/address1" },
"edit-form": { "href": "/applicant1/address1/edit" },
"http://example.com/docs/applicant": { "href": "/applicant1" }
},
"street": "5 Dungeon Drive",
"town": "Snotty Hill",
"county": "London",
"postcode": "NE5 2LT",
"country": "GB",
}
ここで、クライアントはアドレスを修正したいので、"edit-form" 関係を持つハイパーリンクをたどります: ( IANA リンク関係を参照)
GET /applicant1/address1/edit HTTP/1.1
Host: example.com
Accept: text/html
応答:
HTTP/1.1 200 OK
<!DOCTYPE HTML>
<form action="/applicant1/address1" method="POST">
<input name="street" value="5 Dungeon Drive">
et cetera
</form>
その結果:
POST /applicant1/address1 HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
street=5%20Dungeon%20Drive&...
私が HAL を使用したのは、HAL が XML+XLink の JSON バージョンのようなものであり、SO の例を簡単に入力できるためです ;) つまり、ハイパーメディア対応の一般的な解析形式であり、それ以上のものではありません。すべての相互作用は、リンク関係によって導かれます。Web ブラウザは、rel="stylesheet"
その関係が何を意味するかを知っているため、リンクをどうするかを知っています。上記の IANA 定義のリンク関係のリストは、最初に選択する必要があるものです (item
およびcollection
探しているものが十分に具体的でない場合は、あなたのセクターに関連するリンク関係の公開リストを見つけて (たとえば、市場のリーダーが公開している API を参照してください)、可能であればそれらを再利用してください。これにより、ツールはすべて同じリンク関係を探しているため、ツールが相互運用可能になります。質問の Dublin Core の例は、公的に定義された RDF プロパティの同様のリポジトリです。
ハイパーリンクの場合、結合 (契約) はクライアントとサイトの間ではなく、クライアントと一連の関係です。関係はできるだけよく知られている必要があります (これは、ウィキペディアが「ハイパーメディアの一般的な理解」と言うときに意味するものです)。
リソース フィールドについては、リソースを一般的に処理する場合は、RDF ベースのソリューションをお勧めします。これには、ビジネス ドメインに密接に対応するよく知られた RDF プロパティを使用します。JSON への RDF シリアル化はいくつか存在しますが、現時点では明確なリーダーはありません。この時点では、おそらく XML のみをサポートする方がよいでしょう。6 つの簡単なステップでの JSON から RDF へのブログ投稿は、RDF の基礎を学ぶ方法として洞察力があるかもしれません。