ウェブサイト検索

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として解釈し、型として渡すべきであることを伝える属性

string

Mongoが内部的に型を必要としているにもかかわらず

ObjectId
using 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プロバイダーと連携するように設定できます。

関連記事: