リソース表現へのリンクの追加は、Web API コントローラー内で非常に簡単に実行できます。コントローラーのUrl
プロパティ (UrlHelper
クラス) を使用すると、次のように、ルート名を使用してリンクの href を構築できます。
var href = Url.Link("RouteName", new { id = 123 });
の値はhref
ルート構成に基づいて計算されます。この場合は のようなものhttp://example.org/api/products/123
です。href が生成されるすべての場所を更新する必要なく、ルート構成を調整できるため、これは素晴らしいことです。発行されたすべてのリンクは、新しい構成に準拠しています。
しかし、これ、または同様のルートベースの手法を使用して、テンプレート化されたhref を作成できますか? たとえば、HAL のtemplated
リンク プロパティを使用して、リソースから任意の製品へのリンクを作成するには、次のようにします。
"_links": {
"self": {
"href": "http://example.org/api/productfinder"
},
"product": {
"href": "http://example.org/api/products/{productId}",
"templated": true
}
}
(私は実際には productfinder と呼ばれるリソースを持っていません - この質問の不自然な例です)。
routeValues
パラメータをテンプレートの文字列に設定しようとしました。
var href = Url.Link("RouteName", new { id = "{productId}" });
これにより、URL エンコードされた文字列が生成されます: http://example.org/api/products/%7BproductId%7D
. を使用できます.Replace
が、このアプローチは別の理由で失敗します。ルート構成にタイプの制約がある場合、たとえば{id:int}
、href は null になります。
routeValues
テンプレート部分を追加できることを期待 して null を渡そうとしました。Link()
null を返したのでhref
、テンプレート部分だけになってしまいました。さらに、これは次のような複雑なルートでは機能しませんapi/{this}/something/{that}{?q}
だから私は立ち往生しています。ルートを使用してテンプレート化された href を生成できますか? もしそうなら、どのように?