2

WCF REST では、厳密な URL テンプレートを定義できました。

ASP.NET MVC Web API 4 に問題があります。

ルートを通常どおり登録しました。

 routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
             );

私のコントローラーには次のメソッドがあります:

// POST /api/documents
public HttpResponseMessage<Document> Post(Document document) 
{...}

この URL "http://servername.com:53835/api/Documents/ 1337 " (パラメーター "1337" は存在しない) で POST 要求を送信すると、Post(Document document) メソッドが呼び出されます。しかし、この場合、フレームワークがエラーを表示することを望みます。(例: 「このリクエストの API 呼び出しが見つかりません」)。

REST WCFを使用すると、これを厳密に構成できます...この「構成よりも慣習」についてはあまり熱心ではありません...

また、より複雑な URL テンプレートを作成するにはどうすればよいですか?

  • 私はこのようなものが欲しい:

この URL テンプレートを使用した GET リクエストの API: "http://servername.com:53835/api/Documents/1337" は、特定のドキュメント オブジェクトを取得します (作成日、作成者などのメタデータが含まれます ...) .

別の GET リクエストは、次の URL でファイル自体を (ストリームとして) 取得する必要があります: http://servername.com:53835/api/Documents/1337/File

この違いをどのように定義できますか? ドキュメント オブジェクトを取得するための GET メソッドは次のようになります。

// GET /api/documents/5
public HttpResponseMessage<Document> Get(int id)
{...}

同じパラメーター (この場合は「id」) を使用して別のメソッドを定義するにはどうすればよいですか? WCF REST プロジェクトのようにメソッド属性を使用して URL テンプレートを構成する必要がありますか?

{action} プレースホルダーのルーティングを次のように編集できます。

routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{mandant}/{controller}/{id}/{action}",
                defaults: new { mandant = "profile", id = RouteParameter.Optional, action = RouteParameter .Optional}
            );

そして、メソッド属性 [ActionName("File")] と [AcceptVerbs("GET")] を使用できます。

[ActionName("File")]
[AcceptVerbs("GET")]
public HttpResponseMessage FileDownload(int id)

次に、「http://servername.com:53835/api/Documents/1337/File」を呼び出してファイルを取得できます。しかし、これらの「アクション」がもっと必要な場合はどうすればよいでしょうか?

  • より複雑な使用例は、繰り返し部分のある URL です。のようなもの:(この場合、私はいくつかのアイテム特性を持っています。この特性の数は可変でなければなりません)

http://servername.com:53835/api/Documents/characteristic_1/characteristic_2/characteristic_3 http://servername.com:53835/api/Documents/characteristic_1/characteristic_2 _ _

特性を持つ部分は、動的/可変である必要があります。

4

1 に答える 1

0

私もこれをいじってみましたが、このアプローチは多くの場合望ましくない結果を引き起こし、どういうわけか API を使いにくくすることがわかりました。私にとって最も効果的なのは、API メソッドに ID である入力パラメーターを 1 つだけ設定し、URL パラメーターを使用して他のすべての変数を渡すことです。

DRY を回避するために、ActionFilter などを作成することを検討できます。

于 2012-05-15T10:50:54.060 に答える