API開発のためのASP.NETの始め方
ASP.NETは、C#と.NETを使用してウェブAPIを構築するためのプラットフォームです。アプリのバックエンドによく使われ、クラスを自動的にJSONにシリアル化することができます。データベースと通信し、オブジェクトのリストを保存するサービスのセットアップ方法について説明します。
プロジェクトを作成する
Visual Studioを使用します。これは、最初から優れた.NETサポートを提供するためです。「ASP.NET Core Web Application」テンプレートを使用して新しいプロジェクトを作成します:
名前を付けて、「API」を選択してください。ここではASP.NETのフロントエンドは構築していません。
これにより、基本的なAPIを稼働させるために必要なすべてのボイラープレートが初期化されます。実行ボタン(IIS Expressとラベル付けされたボタン、IISウェブサーバーを起動します)をクリックすると、APIが天気に関するダミーデータを表示しているのが見えます。
このベースを使って、データベースに接続し、カスタムオブジェクトを読み書きするシンプルなAPIを設定します。この場合はユーザーデータのコレクションですが、APIはより複雑なエンティティモデルにもほぼ同じように機能します。
データベースを接続する
リクエストの処理ロジックとデータベースとの対話ロジックを分けることは良いアイデアです。読み取りと書き込みのためのいくつかの関数を持つデータベースサービスを作成し、次にデータベースサービスに対話してリクエストに応答するAPIコントローラーを作成します。ただし、最初にやるべきことは、ASP.NETがデータベースと対話できるようにすることです。
データベースを扱うためにいくつかのパッケージをインストールする必要があります。ツールをクリックし、NuGetパッケージマネージャーを選択し、「ソリューションのためのNuGetパッケージの管理」を選んでください。
SQLデータベースを使用している場合、データベース接続は、基盤となるデータベース用にEntityFrameworkCoreを実装する特定のプラグインパッケージによって処理されます。これは、C#オブジェクトをリレーショナルデータベースにマッピングし、LINQクエリやその他のネイティブツールを使用して対話することを可能にするフレームワークです。ほとんどの人気リレーショナルデータベースに対するデータベースプロバイダーの完全なリストはここで確認できます。
ここではMongoDBを使用します。なぜなら、NoSQL文書データベースは、
List<Object>
かなりシームレスに、そしてMongoDBドライバーはEF CoreのようにLINQクエリをサポートしています。
MongoDB.Driverパッケージをインストールします:
プロジェクトのルートに「Models」という新しいフォルダーを作成します。その中に、エンティティモデルを作成します。
User.csデータベースに保存されるコレクションのスキーマになります。これを使うことができます。
[BsonId]と
[BsonRepresentation(BsonType.ObjectId)]MongoDBドライバーにこのID文字列をコレクションIDとして解釈し、型として渡すべきであることを伝える属性
stringMongoが内部的に型を必要としているにもかかわらず
ObjectIdusing MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;
namespace ExampleService.Models
{
public class User
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Name")]
public string Name { get; set; }
public string Email { get; set; }
// etc...
}
}
このフォルダー内に DatabaseSettings.cs というファイルを作成し、データベース設定のためのクラスとインターフェースを保存します。
namespace ExampleService.Models
{
public class ExampleDatabaseSettings : IExampleDatabaseSettings
{
public string ExampleCollectionName { get; set; }
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
public interface IExampleDatabaseSettings
{
string ExampleCollectionName { get; set; }
string ConnectionString { get; set; }
string DatabaseName { get; set; }
}
}
appsettings.jsonに次の構成を追加することで、これらのプロパティ値を設定できます:
"ExampleDatabaseSettings": {
"ExampleCollectionName": "Users",
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "Example"
}
もちろん、Exampleデータベースを作成または名前変更する必要があり、さらにその中にUsersコレクションを作成する必要があります。
最後に、Startup.csのConfigureServicesメソッドにいくつかのコードを追加します。これは、appsettings.jsonファイルから設定を取得し、依存性注入を通じてインターフェースを登録するものです。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ExampleDatabaseSettings>(
Configuration.GetSection(nameof(ExampleDatabaseSettings)));
services.AddSingleton<IExampleDatabaseSettings>(sp =>
sp.GetRequiredService<IOptions<ExampleDatabaseSettings>>().Value);
services.AddControllers();
}
モデルの名前空間を使用して、最上部にディレクティブを追加する必要があります。
CRUDデータベースサービスを書く
データベースが接続されると、会話を行うサービスを追加できます。以下のクラスには、C#が簡単にやり取りできる形式でMongoDBコレクションを表すIMongoCollectionがあります。読み込み、書き込み、更新、削除は、基盤となるコレクションに直接影響します。
コンストラクタメソッドはデータベース設定を受け取り、新しいクライアントを起動し、データベースを取得してから、_users コレクションを初期化します。
using ExampleService.Models;
using MongoDB.Driver;
using System.Collections.Generic;
using System.Linq;
namespace ExampleService.Services
{
public class ExampleService
{
private readonly IMongoCollection<User> _users;
public UserService(IExampleDatabaseSettings settings)
{
var client = new MongoClient(settings.ConnectionString);
var database = client.GetDatabase(settings.DatabaseName);
_users = database.GetCollection<User>(settings.ExampleCollectionName);
}
public List<User> Get() =>
_users.Find(user => true).ToList();
public User Get(string id) =>
_users.Find<User>(user => user.Id == id).FirstOrDefault();
public User Create(User user)
{
_users.InsertOne(user);
return user;
}
public void Update(string id, User userIn) =>
_users.ReplaceOne(user=> user.Id == id, userIn);
public void Remove(User userIn) =>
_users.DeleteOne(user => user.Id == userIn.Id);
public void Remove(string id) =>
_users.DeleteOne(user=> user.Id == id);
}
}
クラスの残りは、データベースと対話するための単純なCRUD操作のセットです。ここで任意のカスタムロジックを実装してもかまいません。
「Startup.cs」に戻ると、これをスタートアップ時にサービスとして追加する必要があります:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ExampleDatabaseSettings>(
Configuration.GetSection(nameof(ExampleDatabaseSettings)));
services.AddSingleton<IExampleDatabaseSettings>(sp =>
sp.GetRequiredService<IOptions<ExampleDatabaseSettings>>().Value);
services.AddSingleton<ExampleService>();
services.AddControllers();
}
もう一度、別の using ディレクティブが必要です。今度は ExampleService.Services のためです。
APIコントローラーの設定
次に、APIアクションを処理するためのコントローラーが必要です。幸いなことに、Visual Studioではこれが簡単にできます。「コントローラー」を右クリックすることで、読み取り/書き込みアクションを持つ新しいコントローラーを追加できます。これにより、いくつかの基本的なメソッドを持つ新しいコントローラーが作成されます。
ルートは上部で定義されています。デフォルトでは、これは/api/controllerに設定されており、ここでcontrollerはコントローラー名(「Controller」部分を除く)です。これを変更することもできますが、これはほとんどの人にとって良いパターンです。
[Route("api/[controller]")]クラスの最上部でデータベースサービスへの参照を追加し、コンストラクタでそれを初期化する必要があります。
private readonly ExampleService _exampleService;
public ExampleController(ExampleService exampleService)
{
_exampleService = exampleService;
}
HttpGetメソッドを、保存しているスキーマのActionResult<List<T>>を返すように変更する必要があります。(もちろん、Models名前空間への参照を追加する必要があります。)ActionResultは、内部のTValueまたはHTTPレスポンスの結果をラップする動的型です。
[HttpGet]
public ActionResult<List<User>> Get()
{
return _exampleService.Get();
}
別のルートで別のGetメソッドを追加したい場合は、属性にパラメータとして渡すことができます:
[HttpGet("otherroute")]
public ActionResult<List<User>> GetSomeThingElse()
{
return _exampleService.GetSomeThingElse();
}
HttpPostメソッドでは、データベースサービスのCreateメソッドを呼び出し、オブジェクトの作成が成功したことをクライアントに通知する201レスポンスを送信するCreatedAtRouteを返します。
[HttpPost]
public ActionResult<User> Create(User userIn)
{
_exampleService.Create(userIn);
return CreatedAtRoute("GetUser", new { id = userIn.Id.ToString() }, userIn);
}
他のルートについては、お好みに合わせて設定できます。一般的なアイデアは、ユーザー入力を処理し、必要な検証を行い、適切なデータベースアクションを呼び出し、ユーザーに役立つ何かを返すか、何が起こったかを伝えるステータスコードを返すことです。
この時点で、上部のIIS Express実行ボタンを押してAPIをテストできるはずです。これにより、デフォルトのルートがボイラープレートに付属の天気サービスAPIになりますので、毎回手入力するのではなく、プロジェクト > プロパティ > デバッグでデバッグルートを変更し、ブラウザ起動オプションを変更できます。
リモートサーバーでテストを行いたい場合は、Build > Publish Serviceからプロダクションビルドを作成できます。ファイル出力を選択し、構成をニーズに合わせて編集します。例えば、自己完結型でビルドすることを選択すると、すべての.NET依存関係がビルドにパッケージ化され、単一の実行可能ファイルとして公開することもできます。また、ここでターゲットランタイムを変更することも可能です。
Linuxに公開したい場合は、.csprojファイルにランタイム識別子を追加する必要があります。
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>もちろん、ここで紹介されているAPIは安全ではありません。ASP.NETには優れた認証システムがあり、JWTベースのトークンをサポートしており、GoogleやFacebookのようなOAuthプロバイダーと連携するように設定できます。









