「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>WebAPI]]

* 目次 [#cdbcbff7]
#contents

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

*基本 [#q5523550]

**ルーティング [#ed5920bd]

***[[WebApiConfigで一括定義する。>#s0bfb2c6]] [#lbc092d5]

***[[Attributeを付与して個別定義する。>#y1a49299]] [#x325589e]

***参考 [#lcef24f7]
-【ASP.NET】APIのルーティングを設定する2つの方法【WebAPI】 - ばしぶろ~
http://vatscy.github.io/blog/2014/06/08/api-routing/

**JSON [#je1f02f9]
以下が参考になる。

***[[JSONを送信するRESTサービスを作成する方法]] [#tfc44920]

***[[JSONを受信するJSON-RPCサービスを作成する方法]] [#h29bf8c0]

**認証 [#k9f0d355]
[[OAuth]] 2.0、[[OpenID Connect]]を使用する。

以下が参考になる。

***[[WebAPIの認証]] [#l84dc7df]
***[[ASP.NET IdentityのOAuth2によるSTS実装]] [#jafe41c3]

**リクエスト送信方法 [#u29628a4]
以下が参考になる。

***[[HttpClientの類の使い方]] [#h3a511bf]

*WebApiConfigの例 [#z826dd05]
 /// <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 [#s0bfb2c6]

***MapHttpRoute [#b6b61019]
-既定では、以下のように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 メソッド|呼び出されるメソッド|h
|1|GET|"Get" で始まる名前のメソッド|
|2|POST|"Post" で始まる名前のメソッド|
|3|PUT|"Put" で始まる名前のメソッド|
|4|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 [#y1a49299]
-[[WebApiConfig>#b6b61019]]の設定を、Route属性を(Method、Class属性に)指定することで上書きできる。~
--Method属性:[Route("update")]
--Class属性:[RoutePrefix("api/profile")]~
RoutePrefixは、必要に応じて併用する。

-例
--定義
---Class属性: https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WS_sample/ASPNETWebService/ASPNETWebService/Controllers/JsonController.cs#L76
---Method属性: https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WS_sample/ASPNETWebService/ASPNETWebService/Controllers/JsonController.cs#L123

--呼び出し側を確認すると、以下のようになっている。
 http://localhost:8888/api/json/XXXXXX
---https://github.com/OpenTouryoProject/FrontendTemplates/blob/develop/SPA/Legacy/SPA_Sample/SPA_Sample/Scripts/app/Sample1.viewmodel.js#L1
---https://github.com/OpenTouryoProject/FrontendTemplates/blob/develop/SPA/Legacy/SPA_Sample/SPA_Sample/Scripts/app/Sample2.viewmodel.js#L1
---https://github.com/OpenTouryoProject/FrontendTemplates/blob/develop/Native/UWP_sample/UWP_Sample.Xaml/MainPage.xaml.cs#L19
---https://github.com/OpenTouryoProject/FrontendTemplates/blob/develop/Native/UWP_sample/UWP_Sample.Html/js/main.js#L26

--[[ASP.NET Core の場合>ASP.NET Core MVC#d04061d7]]


**CORS [#v4d276cb]
-以下の指定で、[[CORS (Cross-Origin Resource Sharing)>クロス ドメイン接続#t317812a]]を有効化する。~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WS_sample/ASPNETWebService/ASPNETWebService/App_Start/WebApiConfig.cs#L42
 // CORS (Cross-Origin Resource Sharing)の有効化
 // 別ドメイン上で動作する Web アプリからアクセス可能に設定。
 config.EnableCors();

-[[ASP.NET Core の場合>ASP.NET Core MVC#s2a4c6cf]]

**認証 [#l3f877a4]
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));

**参考 [#t54048a1]
-ASP.NET Web API の ルーティング~
https://garafu.blogspot.jp/2013/11/aspnet-web-api_2302.html
-連載:ASP.NET Web API 入門:第4回 ルーティングの設定/検証/例外処理 (1/3) - @IT~
http://www.atmarkit.co.jp/ait/articles/1312/16/news056.html

-miso_soup3 Blog
--ASP.NET WEB API ルーティングについていろいろ~
http://miso-soup3.hateblo.jp/entry/20130110/1357822008
--ASP.NET Web API 2 Attribute Routing~
http://miso-soup3.hateblo.jp/entry/2013/07/03/223816

*ApiControllerの例 [#ef2702ee]
**基本 [#j9a5ac60]
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)
     {
     }
 }

**バインディング [#rfb25f2f]
基本的に、[[モデル・バインディング>#c5310621]]を使用する。

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

-https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WS_sample/ASPNETWebService/ASPNETWebService/Controllers/JsonController.cs#L175

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

***その他のバインディング [#t124ac98]
[[モデル・バインディング>#c5310621]]を使用しない方法。

-ASP.NET Web API で クラスを定義せずに POST された Body 値を取得する - miso_soup3 Blog~
http://miso-soup3.hateblo.jp/entry/2015/04/20/173740

**CORS  [#jbd37145]
[[CORS (Cross-Origin Resource Sharing)>クロス ドメイン接続#t317812a]]に対応する場合、

***EnableCors属性 [#z87a5cea]
前述の、[[WebApiConfigでのCORSの有効化>#v4d276cb]]を行った後に、~
以下のようにApiControllerにEnableCors属性を指定する。

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

***認証CookieをCORSで送信 [#l6bc1b72]
以下が参考になるが、

-CORSリクエストでクレデンシャル(≒クッキー)を必要とする場合の注意点 - Qiita~
http://qiita.com/kawaz/items/1e51c374b7a13c21b7e2

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

***参考 [#f1f22d56]
-ASP.NET Web API 2 CORS サポートについて - miso_soup3 Blog~
http://miso-soup3.hateblo.jp/entry/2013/10/08/015152

*その他 [#g6a9916c]

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

-なお、System.Web.Httpを使用するには、Microsoft.AspNet.WebApi.Coreをインストールする必要がある。
-また、WebAPI 機能を使う際には、Microsoft.AspNet.WebApi.*のインストールが必要になる。

-ActionFilterAttribute~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Business/Presentation/MyBaseAsyncApiController.cs

***参考 [#g69b8221]
-c# - Where can I find a NuGet package for upgrading to System.Web.Http v5.0.0.0? - Stack Overflow~
https://stackoverflow.com/questions/20202188/where-can-i-find-a-nuget-package-for-upgrading-to-system-web-http-v5-0-0-0
-ASP.NET MVC4 の Web API を学んでみる その4 〜Filter編〜 - normalian blog~
http://normalian.hatenablog.com/entry/20121014/1350217800
-Web API における操作ごとの制御 (Validation, 認証-権限, Exception 処理 など) – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2012/03/11/web-api-validation-exception/
-ASP.NET Web API で 独自 フィルター の実装方法 - galife~
https://garafu.blogspot.jp/2013/11/aspnet-web-api_2.html

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

***参考 [#q5903ef8]
-OWIN を使ったセルフホストで ASP.NET Web API 2 をかんたん起動 - miso_soup3 Blog~
http://miso-soup3.hateblo.jp/entry/2013/10/17/025136
-Owin Self-Host でWeb API 2を使ってみる | Qaramell Blog~
http://blog.qaramell.com/papemk2/10341
-ASP.NET Web API によるサービス通信 | Microsoft Docs~
https://docs.microsoft.com/ja-jp/azure/service-fabric/service-fabric-reliable-services-communication-webapi

*参考 [#u28c5ae5]
**ファースト・ステップ [#k9ba3b9e]
-ASP.NET WebAPIでAPIを作ってJavaScriptから呼ぶまで - かずきのBlog@hatena~
http://blog.okazuki.jp/entry/2014/01/02/172001

-[ASP.NET Web API] Web API を使ってみたので作り方のメモ - Netplanetes~
http://www.pine4.net/Memo/Article/Archives/546

-50分で掴み取る ASP.NET Web API パターン&テクニック~
https://www.slideshare.net/miso_desu/50-aspnet-web-api

***@IT [#ma4c4e15]
-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 [#afec787d]
-ASP.NET Web APIでHello World~
https://qiita.com/ledsun/items/e8bd4acf796a3ff83db3
-ASP.NETでWebAPIを作成した際のメモ書き~
https://qiita.com/Mizuki901/items/53b1c257f94b81ba11be

**miso_soup3 Blog [#s37c410a]
-ASP.NET Web API 2 で追加された機能について~
http://miso-soup3.hateblo.jp/entry/2013/12/06/225220
-ASP.NET Web API 2 CORS サポートについて~
http://miso-soup3.hateblo.jp/entry/2013/10/08/015152
-ASP.NET Web API 2.1 その 1~
http://miso-soup3.hateblo.jp/entry/2014/01/22/022254
-ASP.NET Web API 2.1 その 2 ~Global Error Handling~~
http://miso-soup3.hateblo.jp/entry/2014/01/22/022129

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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS