web-dev-qa-db-ja.com

クエリパラメータによるWeb API 2 GET

WCF Rest/Json ServiceからWebApi2に切り替えて、このメソッドをマップする方法を探しています。

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Users?mail={mail}&pw={pw}")]
UserData getUserByEmailAndPw(String mail);

IDを使用することを目的としたデフォルトのGETを使用できないように、電子メールとパスワードでユーザーを照会したい。私の知る限り、Restの属性を介してこれを行う必要があります...

私はこれのためにルートを登録する必要がありますか、それともより良い方法がありますか(おそらく慣例により)?

10
stefan

コントローラーアクションのためにWebApiにルートを常に登録する必要があります。これは attribute routing または-で行うことができます 慣習ベースのルーティング

GETリクエストのクエリ文字列で渡されるパラメーターは、ルーティング構成メソッドのいずれかで実際に明示的に指定する必要はありません。

コントローラーアクションで指定するパラメーターは、GET要求のクエリ文字列で送信されるパラメーターにマップされます。

ルートが次のように構成されているデフォルトのWebApi規則ベースのセットアップを使用している場合:

var config = new HttpConfiguration();
// some other config setup for web api
...
...
// route config
config.Routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

次に、このようなコントローラがあなたのために動作します:

public class UsersController : ApiController {
   // this maps to a get requests to:
   // domain/api/users
   // and domain/api/users?id=someid
   // and domain/api/users?mail=somemail
   // and domain/api/users?pw=somepw
   // and domain/api/users?mail=somemail&pw=somepw
   // and domain/api/users with any query string really
   [HttpGet]
   public IHttpActionResult Get(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return this.Json(users);
   }
}

または、属性ルーティングを使用してから、コントローラーとアクションメソッドを好きなように呼び出すことができます。次のようにルートを構成します。

var config = new HttpConfiguration();
// some other config setup for web api
...
...
// route config
config.MapHttpAttributeRoutes();

次に、次のようなコントローラーを作成できます。

public class FooController : ApiController {
   // this maps to a get requests to:
   // domain/users
   // and domain/users?id=someid
   // and domain/users?mail=somemail
   // and domain/users?pw=somepw
   // and domain/users with any query string really
   [HttpGet]
   [Route("users")]
   public IHttpActionResult Bar(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return this.Json(users);
   }
}

ただし、Attribute Routingを使用すると、競合するルートを作成しないように注意する必要がありますWebApiルートが複数のアクションメソッドにマッピングされている場合、リクエストをルーティングするコントローラーとアクションはわかりません。

これらの例でthis.Jsonを使用して、wcfResponseFormat = WebMessageFormat.Jsonに一致するjsonコンテンツを含むhttp応答を返しました。しかし、もちろん[〜#〜] clr [〜#〜]タイプを返すことができます:

   [HttpGet]
   [Route("users")]
   public IEnumerable<MyUser> Bar(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return users;
   }

そして、WebApi'sコンテンツネゴシエーション 応答メッセージのコンテンツタイプを処理します。

15
Anish Patel