2012-09-05 5 views
19

他の人がWeb APIのハイパーメディアリンクを生成する問題をどのように扱っているのか不思議です。具体的には、私はASP.NET Web APIを使用しており、操作でハイパーメディア関連の型を返すか、リソース自体を返すことと、後でハイパーメディアの問題がパイプラインで発生することとの間で悩まされています。Web APIでHypermediaリンクを生成する

public Resource<Order> GetOrder(int id) { 
    return new Resource<Order>() { 
     Content = new Order(), 
     Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()} 
    } 

以上

public Order GetOrder(int id) { return new Order(); } 

のようなもの。そしてHttpOperationHandlerまたはカスタムフォーマッタか何か内部のハイパーメディアリンクを追加:ある 、人々のようなことを行う傾向があるのですか?

アプローチが#2のような場合は、どのようなリンクを生成するのかをどのように知っていますか?すべてのOrderオブジェクトに対して生成される標準的なリンクがいくつかありますか? OrdersControllerのさまざまな操作を装飾する属性ですか?

+0

補足:Web API(http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and)のハイパーメディアに関するGlenn Blockの記事を読みました。 (上記の例1と同様)リンクが生成されているように見えますが、最終的に言及しているミドルウェアのルートがより自然に感じられるように感じます。 – Jordan0Day

+1

teched newzealandのammyからのプレゼンテーションを見てください。http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305彼女のソリューションはWeb APIを使ったハイパーメディアにも有望です。ここではgithubサンプルコード – Gomes

答えて

24

私はオプション2(後でハイパーメディアリンクをパイプラインに追加する)とblogged about doing this yesterdayを優先します。

解決策は、メッセージハンドラを使用してクライアントに返される前に、ハイパーメディアリンクを使用して自分のリソースを「充実させる」ことでした。

+0

これは本当にクールです。共有してくれてありがとう。私たちは拡張メソッドを使用しました。これは、アクションメソッドで1行のコードを占めたCookieカッターコードの方が多くなっていました。私はリソースが返されていることが好きで、コンテキストに基づいてハイパーメディアを追加したり追加したりすることはできません。 – suing

9

あなたは、私はそれはそれを行うにはいいと簡単にできるようにseens、あなたがnugetパッケージを経由して、それを得ることができるように私の次のプロジェクトでそれを使用することを計画していますgithub

からHyprlinkrを使用することができます。

+3

を参照してください。Hyprlinkrはあなたが生成したいリンクが分かっているときにリンクを実際に生成するための良い解決策です。私の質問は、「どのように私はそれらを生成すべきですか」ではなく、「生成する必要のあるリンクをどのように知っているのですか?いずれにせよ、Hyperlinkrは、「方法」の部分に到達すると、問題を解決するのに役立ちます。 – Jordan0Day

2

ASP.NET MVC はWeb APIのtext/html-constrainedバージョンとして表示されるため、この問題を処理するためのASP.NET MVCのアプローチを検討することは有益です(マニュアルコンテンツのネゴシエーションにもかかわらず)、明らかにWeb APIの設計に多大な影響を与えたためです。

基本的には、カスタムフォーマッタを使用して、ルート属性またはアクション属性に基づいて表現を変更できます。これは、ASP.NET MVCがモデルからビューを分離する方法によって通知されます。 ASP.NET MVCプロジェクトでは、単一のモデルをさまざまなビューテンプレートでレンダリングできます。これらのビューテンプレートのそれぞれは、遷移リンク(アンカー、フォーム、リンク要素)を本質的にモデルの特定の表現に「ハードコードする」。ビューテンプレートの選択は、慣例(コントローラーおよびアクション名)によって主に行われますが、アクション内でハードコードすることもできます。

ASP.NET MVCでのビューエンジンとビュー検出規則は、カスタムWeb APIフォーマッタと見なすことができます。これは、サポートされているメディアタイプごとに、カスタムフォーマッタが経路の詳細(およびオプションで呼び出されたアクションメソッドに適用される属性)を使用してリソース状態を定義するように一般化することができます。 (この規約の下では、リソースの状態を反映するアクション名を選択することでメリットがあります。)フォーマッタはリソースの状態を認識した後、州固有の書式設定コードに委任することができます。このコードでは、州固有のリンクが定義されています。

この州固有のフォーマットコードは、Razorビューが部分ビューの合成をサポートするのと同じように、他のサブフォーマッタに委譲することもできます。

1

私は私の解決策here

それはクラスを使用し、プロパティがエンティティにリソースリンクオブジェクトを移入するApiController伸長法と組み合わせて属性を追加しました。また、任意のコレクションプロパティのリンクを設定することもできます。完成した記事ではありませんが、直感的であり、良いスタートを切ることができます。

関連する問題