ビジネス Windows ストアアプリ開発とアーキテクチャー Part 2: REST サービスの実装
皆様、こんにちは!
早速、前回の続きに参りましょう。今回は、ASP.NET Web API を使ってどのようにREST サービスを実装するか、というところになります。Windows ストアアプリからリモートデータを使用するためには、なんらかの REST または SOAP サービスを公開する必要があります。このサンプルでは、Windows ストアアプリから基本的なデータ操作ができるようなサービスを作成します。
1. 前回使用した EFModel ソリューションを Visual Studio 2012 で開きます。
2. 当該ソリューションを右クリックして、新しいプロジェクトの追加、を選択しクリックします。
3. ASP.NET MVC 4 Web Application を選択し、名前を適当につけます(ここでは RestService)。
4. OK ボタンをクリックします。
5. 次に出てくるダイアログボックスで、Web API を選択し、OKをクリックします。
6. REST サービスの初期のスケルトンが作成されます。
7. EFModel プロジェクトに参照設定を追加します。次いで、Controller を実装します。
8. RestService プロジェクトのController フォルダーを右クリック->追加->コントローラーを選択します。
9. CookBookAppController という名前にして、OK をクリックします。
このコントローラーを下記の通り実装します :
using DataModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Globalization;
namespace RestService.Controllers
{
public class CookBookAppController : ApiController
{
// GET CookBookApp
[HttpGet]
public List<Place> Place()
{
/// return new string[] { "value1", "value2" };
///
try
{
using (CookBookApp ctx = new CookBookApp())
{
var lst = ctx.Places.ToList();
return lst;
}
}
catch (Exception)
{
throw;
}
}
// GET CookBookApp/5
[HttpGet]
public Place Place(int id)
{
try
{
using (CookBookApp ctx = new CookBookApp())
{
return ctx.Places.Where(x => x.PlaceID == id).FirstOrDefault();
}
}
catch (Exception)
{
throw;
}
}
// GET CookBookApp/5
[HttpGet]
public IEnumerable<Place> Search(string queryText)
{
try
{
//queryText = queryText;
using (CookBookApp ctx = new CookBookApp())
{
var lst11 = ctx.Dishes.Where(x => x.Name.ToLower().Contains(queryText.ToLower())).Select(x => x.DishID).ToList();
var lst22 = ctx.Towns.Where(x => x.Name.ToLower().Contains(queryText.ToLower())).Select(x => x.TownID).ToList();
var lst = ctx.Places.ToList();
var ll = from p in ctx.Places
where
lst11.Contains(p.DishID) ||
lst22.Contains(p.TownID) ||
p.Name.ToLower().Contains(queryText.ToLower()) ||
p.Message.ToLower().Contains(queryText.ToLower())
select p;
var rr = ll.ToList();
return rr;
}
}
catch (Exception)
{
throw;
}
}
// POST CookBookApp
[HttpPost]
public void Place([FromBody]Place plc)
{
try
{
if (plc == null)
return;
using (CookBookApp ctx = new CookBookApp())
{
if (plc.PlaceID == -1)
{
ctx.Places.Add(plc);
ctx.SaveChanges();
}
else
{
var p = ctx.Places.Where(x => x.PlaceID == plc.PlaceID).FirstOrDefault();
if (p == null)
return;
p.Name = plc.Name;
p.Message = plc.Message;
p.Description = plc.Description;
p.DishID = plc.DishID;
p.TownID = plc.TownID;
p.Image = plc.Image;
ctx.SaveChanges();
}
}
}
catch (Exception)
{
throw;
}
}
// DELETE CookBookApp/5
[HttpGet]
public List<int> DPlace(int id)
{
try
{
using (CookBookApp ctx = new CookBookApp())
{
var p = ctx.Places.Where(x => x.PlaceID == id).FirstOrDefault();
if (p == null)
return new List<int>() { 0 };
ctx.Places.Remove(p);
ctx.SaveChanges();
}
}
catch (Exception)
{
throw;
}
return new List<int>() { 1 };
}
// GET Town
[HttpGet]
public List<Town> Town()
{
/// return new string[] { "value1", "value2" };
///
try
{
using (CookBookApp ctx = new CookBookApp())
{
return ctx.Towns.ToList();
}
}
catch (Exception)
{
throw;
}
}
// GET Dish
[HttpGet]
public List<Dish> Dish()
{
/// return new string[] { "value1", "value2" };
///
try
{
using (CookBookApp ctx = new CookBookApp())
{
// var ss= ctx.Dishes.ToString();
return ctx.Dishes.ToList();
}
}
catch (Exception)
{
throw;
}
}
}
}
SQL Server に test ユーザーを作り、これでログインを行います。Connection String を編集します。下記のようにSQL Server Management Studio で適切に設定を行います。
※この test ユーザーでローカルホストの SQL Express に SQL Server 認証でログインできるかどうかをまずは確認してください。インストール時、SQL Express を普通にインストールすると、Windows 認証モードになっているはずです。これをSQL Server Management Studio のサーバーのプロパティを開いて混合モードに変更しないと、ログインができません。
また、クライアントプロトコルも、TCP/IPや、名前付きパイプが有効になっていることを確認してください。
なお、変更した後は、SQL Server 構成マネージャーで、再起動を行わないと変更が反映されませんので、注意してください。
詳しくはこのあたりをご覧ください。
https://msdn.microsoft.com/ja-jp/library/ms188670.aspx
https://msdn.microsoft.com/ja-jp/library/ms190737(v=sql.100).aspx
https://msdn.microsoft.com/ja-jp/library/ms345416(v=sql.100).aspx
https://msdn.microsoft.com/ja-jp/library/ms175496(v=sql.105).aspx
12. Web.Config ファイルに、下記のように、ConnectionString を追加します。
<connectionStrings>
<add name="cookbook_db"
providerName="System.Data.SqlClient"
connectionString="Data Source=.\sqlexpress;
Initial Catalog=cookbook_db;Persist Security Info=True;
User ID=testuser;Password=(適当に決めてください);"/>
</connectionStrings>
13. RestService をスタートアッププロジェクトに設定して、実行します。
14. Internet Explorer が起動したら、
下記のアドレスを入力します : ※ ポート番号は適宜読み替えてください。
https://localhost:38304/cookbook/place
ファイルを開く、を選択するとメモ帳が立ち上がり、データベースから全ての Places が取得できます。
このデータは、前回実行した EF Test コンソールアプリケーションが挿入したものです。
※ .json ファイルを、メモ帳に関連付けしてあります。WebMatrix をインストールすると、自動的に WebMatrix に関連付けされてしまうので、関連付けを変更しておいてください。もし、Fiddler を使っている場合には、そちらに関連付けるのも便利かもしれません。
以上です。
この後、完成品のアプリを作成してご紹介しますので、このエントリの続編をご期待ください。
鈴木 章太郎