「[[マイクロソフト系技術情報 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]]