2012-02-24 9 views
8

私はここで多くの議論を読んで、Jon Moore's presentation(これはたくさん説明しました、btw)を見て、Roy FieldingのHATEOASのブログ記事を読んでいますが、依然としてクライアントになると少し暗いです設計。HATEOASクライアントデザイン

API質問

今のところ、私は単にリソースを表すために、フォーム/アンカーと定義リストにXHTMLを返しますよ。次のスニペットは、フォーム/アンカー/リストのレイアウトの詳細です。

# anchors 
<li class='docs_url/#resourcename'> 
    <a rel='self' href='resource location'></a> 
</li> 

# forms 
<form action='action_url' method='whatever_method' class='???'></form> 

# lists 
<dl class='docs_url/#resourcename'> 
    <dt>property</dt> 
    <dd>value</dd> 
</dl> 

私の質問は主にフォームです。 Jonの講演では、(add_location_form)などのフォームタイプとそれに必要な入力を文書化しています。私は多くのリソースを持っていませんが、抽象的なフォームタイプ(追加、削除、更新など)を考えていて、ターゲットリソースの有効な表現を送信する必要がある(追加、更新)あなたは識別子を送信する必要があります削除と。

質問1:HATEOASの概念とは、私たちは本当にだけで、クライアントは、ちょうどすべてのデータを送り返す(それらを追加、削除、更新などのクラス分けで)フォームを「発見」させるべきではありません、我々彼らに与えた?ここでの私の本当の疑問は(議論ではない)これは良い習慣に従うのでしょうか?

クライアントの質問この効果のクライアントコード(APIの消費者)とそのUIを行う方法を発見-ことができるというリソースに対する私たちの行動とHATEOAS、後

。これらのプリンシパルに従うと、UIは利用可能なアクションのみを表示すべきですが、その実装方法は素晴らしいと思います。

私の現在のアプローチは、クライアントの開発時に知られているアクション(フォームクラス、つまりadd、delete、update)を知り、uiコントロールがあればそれを表示するためにxmlとxpathとしてレスポンスを解析しています利用可能です。

質問2:私の発見方法は間違っていますか?それとも、クライアントが心配する限り(フォームクラスを知っているか)これはあまりにも魔法ですか?これは、クライアントがそれぞれのリソースで利用可能なアクションを知っていることを前提としていないでしょうか(それは、クライアントを作成する理由のようなものかもしれません)、リソースへのアクション(フォームクラス)フォームクラスを文書化し、クライアント(およびクライアント開発者)がそれらを調査して発見できるようにしますか?

私はこれでどこにいても知っていますが、どんな洞察も高く評価されます。私はこれらの2つの質問のいずれかによく答える回答に答えてマークします。ありがとう!

答えて

6

いいえ、あなたはかなり目立っています。

ブラウザは、単にHTMLペイロードをレンダリングし、実際に、解釈の意味を見つけ、そして潜在的に適切なフォームを埋めるために人間に依存しています。

マシンのクライアントは、これまでのところ、「解釈」の部分ではかなり悪くする傾向があります。だから、開発者は事前に決定を下してマシンクライアントを非常に細かくガイドする必要があります。

理想的には、「スマート」HATEOSクライアントは、特定の事実を持っている、そしてそれは、より良いサービスの要件にそれらの事実をマッピングすることができるようにコンテキストを認識しているであろう。

これは私たちがやっていることなのでしょうか?私たちは、 "ああ、名前、住所、クレジットカード番号がほしい"という形をしています。 「名前」、「住所」、「クレジットカード」の数字だけでなく、私の名前やクレジットカードに記載されている人の名前、または出荷される人の名前に。

「intuit」の部分でも、マシンはかなり手間がかかりません。開発者は、正しい事実とその配置方法を決定するために必要と思われるものを論理的にコーディングします。

しかし、理想的なクライアントに戻って、各フォームはフィールドが望むものを「知っている」ことを知り、「ファクト」の内部リストを調べ、要求のペイロードを適切に埋め込み、最後に要求を行います。

わかりやすく、明らかに脆弱なやり方は、単にパラメータ名を内部データにマップすることです。パラメータ名が "name"の場合、firstName + "" + lastNameのようなものにハードコードすることができます。あるいは、実際の関係者が彼らが船積みについて話していることを「知っている」と考えるかもしれません:shipTo.firstName + "" + shipTo.lastName。

時間の経過とともに、マッピングの集まりなどを構築して、突然ペイロードに新しいフィールドが導入され、それがすでに知っているフィールドになった場合でも、自動的にそのフィールドを埋め込むことができます"クライアントに変更することなく。

しかし、これは実行できますが、ほとんど完了していません。セマンティクスは通常はあいまいですが、新しいペイロードのたびに新しい「直感」でコードを作成しなければならないため、ペイロードに直接コードを書いてそれを実行することもできます。

しかし、特にHATEOSについての重要なことは、データをサーバーに強制しないことです。サーバーは、特にフォームを提供している場合は、それが何を望んでいるかを伝えます。

したがって、思考プロセスは「ああ、送金請求書が必要な場合は、名前、住所、注文番号が必要で、URLがエンコードされていて、送付したいと思っています。http://example.com/shipping_invoiceだから私はちょうどいつも送るでしょう:名前+ "&" +アドレス+ "&" +毎回http://example.com/shipping_invoiceにorderNumberです! "

あなたがしたいのは、「名前、住所、注文番号が必要なのが分かります」というのは、リクエストごとにフォームを読むことです。彼らが名前を欲しがるなら、私は彼らに名前をつけるだろう、もし彼らが住所を欲しいなら、私はそれらに住所を与えるだろう、彼らが注文番号を望むなら、私はそれらに注文番号を与えるだろう、そして、彼らがPRE-私はフォームタグのアクションフィールドから得たURLに、私がサポートしていると思ったエンコーディングで送るでしょう。 "

前者の場合、毎回そのペイロードが必要であるとみなしていることがわかります。 URLを厳密にコーディングしている場合とまったく同じです。一方、二人目の人は、名前と住所が重複していると判断した可能性があるので、もう質問しません。たぶん彼らはあなたがまだサポートしていないかもしれない新しい機能のいくつかの素敵なデフォルトを追加しました。多分エンコーディングをマルチパートに変更したのでしょうか?または、エンドポイントURLを変更しました。知るか。

クライアントのコード作成時に知っていることを送信することはできますか?彼らが物事を変えたならば、あなたはできることのみを行うことができます。フィールドを追加する場合は、必要のないフィールドを追加してください。しかし、彼らがインターフェースを壊してしまったら、彼らはインターフェースを破壊し、エラーをログに記録します。それほど多くはできません。

しかし、HATEOSの部分を活用すればするほど、より多くの情報を利用できるようになり、より柔軟に対応できるようになります。リダイレクトを正しく実行し、エンコードとメディアの種類に注意を払うと、クライアントがなります。

結局のところ、ほとんどの人は単にクライアントでそれをしません。彼らは単純なので、彼らのハードコアのコードは、バックエンドが問題に十分に迅速に変化していないか、またはそのような変更が発生した場合のダウンタイムは、クライアントを修正するまで受け入れられると仮定します。より一般的には、特に社内システムを使用する場合は、単にXYZ APIを変更していた開発者からのメールを受け取るだけで、3月1日には公開されますので、クライアントを更新し、統合テスト中にリリースチームと調整してください。

これはまさに現実です。それはあなたがそれをしてはならないということを意味するのではなく、よりスマートなクライアントにとってあなたのサーバーをよりフレンドリーにするべきではありません。すべてが良いRESTベースのシステムを無効にしないと仮定した悪いクライアントを覚えておいてください。これらのシステムはひどいクライアントとうまく動作します。 wget ftw、ええ?

+0

完璧!したがって、フォームのさまざまな「クラス」を文書化し、ドメインに応じて利用可能な場所に公開し、クライアントが「既知の」フォームを探すことを許可するアプローチは、フォームを使用するのではなくフォームを使用する限り可能です。これは素晴らしい。幸いにも、当分の間、私はクライアントとAPIの両方を作成しています。 – jowee

+0

サーバーのリソースにマップするクライアントコード内のオブジェクトを作成するのがよい方法ですか?私は、クライアントがフォームフィールドを「記入する」能力をより簡単に理解できるようになるので、そうすると思います。またはこれはあまりにも多くの複製(すなわちDRY)ですか?私は実際には2つの全く異なるアプリケーション(API、クライアント)について話しているので、この意味ではうまくいくと思うので、DRYは適用されません。 – jowee

+1

さて、このトリックは、サーバーが実際に尋ねることに書いて、あなたが思うものではなく、あなたにするように指示します。あなたが想定しているほど、システムはより壊れやすく、変化するのに耐えるようになります。しかし、柔軟性はコーディングとコードの複雑さを犠牲にしているため、ほとんどの人は気にしません。 –

関連する問題