マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

  • RESTful な HTTP サービスを構築するためのフレームワーク。
  • 軽量のため、ASP.NET MVCと違い、専門書などは不要。

基本

ルーティング

WebApiConfigで一括定義する。

Attributeを付与して個別定義する。

参考

JSON

以下が参考になる。

JSONを送信するRESTサービスを作成する方法

JSONを受信するJSON-RPCサービスを作成する方法

認証

OAuth 2.0、OpenID Connectを使用する。

以下が参考になる。

WebAPIの認証

ASP.NET IdentityのOAuth2によるSTS実装

リクエスト送信方法

以下が参考になる。

HttpClientの類の使い方

WebApiConfig?の例

/// <summary>MultiPurposeAuthSite.App_Start</summary>
namespace MultiPurposeAuthSite.App_Start
{
    /// <summary>WebApi定義(テンプレート)</summary>
    public static class WebApiConfig
    {
        /// <summary>Register</summary>
        /// <param name="config">HttpConfiguration</param>
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // 「Bearer Token」認証のみを使用するように、Web API を設定。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // JSON データにはCamelCaseを使用 (JSON.NET)
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            // CORS (Cross-Origin Resource Sharing)の有効化
            // 別ドメイン上で動作する Web アプリからアクセス可能に設定。
            config.EnableCors();

            // Web API routes を設定する。

            // Attribute Routing
            config.MapHttpAttributeRoutes();

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

Routing

MapHttpRoute?

  • 既定では、以下のようにRoutingが定義されている。
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
  • ASP.NET MVC と違い、ASP.NET Web APIのRoute定義には、(既定では)Action Method名の指定が無い。
  • 代わりに、Web API を使用した場合、リクエストの HTTP メソッドに応じて、
    以下のようにControllerのAction Methodが自動的に呼び出される。
    項番HTTP メソッド呼び出されるメソッド
    GET"Get" で始まる名前のメソッド
    POST"Post" で始まる名前のメソッド
    PUT"Put" で始まる名前のメソッド
    DELETE"Delete" で始まる名前のメソッド
  • 従って、Web API のAction Methodを呼び出す際の URL は、HTTPメソッドを加味し、以下のようになる。
    http://ip or fqdn(:port)/(application名/)Controller名/id
  • {id}はURLから引数を取る方法で、(Optionalに設定しているため、)使用しても、しなくてもOK。
  • 上記の定義の場合、WebAPIのクラス・メソッド定義は、以下のようになる。
    public class ValuesController
    {
      // GET ~/api/values/?id=32
      public string Get(int id)
      {
  • また、デフォルトのHTTPメソッドに対応したActionMethod?を使用するのではなく、
    以下の様に{action}の定義を行えば、独自のActionMethod?名を明示できる。
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
  • 従って、Web API のAction Methodを呼び出す際の URL は以下のようになる。
    http://ip or fqdn(:port)/(application名/)Controller名/ActionMethod名/id

MapHttpAttributeRoutes?

  • WebApiConfigの設定を、Route属性を(Method、Class属性に)指定することで上書きできる。
    • Method属性:[Route("update")]
    • Class属性:[RoutePrefix?("api/profile")]
      RoutePrefix?は、必要に応じて併用する。

CROS

認証

Web API の認証は、OAuth 2.0のBearer Tokenを使用するのが一般的になりつつある。

// Web API configuration and services
// 「Bearer Token」認証のみを使用するように、Web API を設定。
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

参考

ApiController?の例

基本

Web API を利用した場合のコントローラの例を以下に示す。

同じコントローラの中で、
GET に対応したメソッドを複数定義したい場合などは、
以下のようにオーバーロードで対応できる。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

バインディング

基本的に、モデル・バインディングを使用する。

モデル・バインディング

モデル・バインディングは、以下のように実装できる。

「.\SPA_Sample\Models\WebApiParams?」を使用してModelBinding?している。

その他のバインディング

モデル・バインディングを使用しない方法。

CORS

CORS (Cross-Origin Resource Sharing)に対応する場合、

EnableCors?属性

前述の、WebApiConfigでのCROSの有効化を行った後に、
以下のようにApiController?EnableCors?属性を指定する。

/// <summary>OAuthResourceServerのApiController(ライブラリ)</summary>
[Authorize]
[EnableCors(
    // リソースへのアクセスを許可されている発生元
    origins: "*",
    // リソースによってサポートされているヘッダー
    headers: "*",
    // リソースによってサポートされているメソッド
    methods: "*",
    // 
    SupportsCredentials = true)]
public class OAuthResourceApiController : ApiController
{

認証CookieをCROSで送信

以下が参考になるが、

最近のOAuth 2.0 や OpenID Connect等では、"Implicit Grant"と呼ばれるWebAPI専用フローがあり、認証Cookieは使用しないで、
Bearer TokenというものをHTTPヘッダに付与して認証・認可するのが一般的になってきている。CROSの認証などもコレによって行う。

参考

その他

ActionFilterAttribute?

前後処理の実装に、MVCのようにベースクラスが使用できなくなったため、
WebAPI用のFilterAttribute?(System.Web.Http.Filters.ActionFilterAttribute?)を使用する。
なお、System.Web.Httpを使用するには、Microsoft.AspNet?.WebApi?.Coreをインストールする必要がある。

参考

OWIN

ASP.NET Web API2からOWIN対応され、セルフホストが可能になっている。

参考

参考

ファースト・ステップ

@IT

  • Insider.NET > 連載:ASP.NET Web API 入門
    http://www.atmarkit.co.jp/ait/subtop/features/dotnet/aspwebapi_index.html
    • 第1回 ASP.NET Web APIの全体像をつかむ(2013/07/30)
    • 第2回 RESTfulなAPIの設計を学ぼう(2013/10/23)
    • 第3回 APIコントローラの実装方法 (2013/11/06)
    • 第4回 ルーティングの設定/検証/例外処理(2013/12/16)

Qiita

miso_soup3 Blog


Tags: :.NET開発, :通信技術, :OWIN, :.NET Core, :ASP.NET, :ASP.NET Web API


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-07 (金) 14:10:02 (41d)