Si të filloni me ASP.NET për Zhvillimin e API
ASP.NET është një platformë për ndërtimin e API-ve në internet me C# dhe .NET. Zakonisht përdoret për backend-et e aplikacioneve dhe mund të serializojë automatikisht klasat në JSON. Ne do të kalojmë në ngritjen e një shërbimi që flet me një bazë të dhënash dhe ruan një listë të objekteve.
Krijimi i një Projekti
Ne do të përdorim Visual Studio, pasi ofron mbështetje të shkëlqyer .NET jashtë kutisë. Krijo një projekt të ri duke përdorur shabllonin ASP.NET Core Web Application:
Jepini një emër dhe zgjidhni API, pasi ne nuk po ndërtojmë një frontend ASP.NET këtu.
Kjo do të inicializojë zgjidhjen tuaj me të gjithë bojlerpllakën e nevojshme për të vënë në funksion një API bazë. Nëse klikoni butonin e ekzekutimit (të etiketuar IIS Express, i cili fillon një server në internet IIS), do të shihni API-në që shfaq disa të dhëna të rreme rreth motit.
Ne do ta përdorim këtë bazë për të ngritur një API të thjeshtë që do të lidhet me një bazë të dhënash dhe do të lexojë dhe shkruajë objekte të personalizuara. Në këtë rast, është një koleksion i të dhënave të përdoruesit, por API do të funksionojë kryesisht njësoj për modelet më të ndërlikuara të entiteteve.
Lidhja e një baze të dhënash
Është një ide e mirë të ndash logjikën e trajtimit të kërkesave dhe logjikën e trajtimit të bisedave me bazën e të dhënave. Ne do të krijojmë një shërbim të bazës së të dhënave me disa funksione për lexim dhe shkrim, pastaj një kontrollues API që do t'u përgjigjet kërkesave duke folur me shërbimin e bazës së të dhënave. Gjëja e parë që duhet bërë, megjithatë, është që në radhë të parë të komunikoni ASP.NET me një bazë të dhënash.
Do të na duhet të instalojmë disa paketa për të punuar me një bazë të dhënash. Klikoni në Tools > NuGet Package Manager dhe zgjidhni Manage NuGet Packages For Solution.
Nëse jeni duke përdorur një bazë të dhënash SQL, lidhja e bazës së të dhënave trajtohet me paketa të veçanta shtesë që zbatojnë EntityFrameworkCore për bazën e të dhënave bazë. Ky është një kornizë që harton objektet C# në një bazë të dhënash relacionale dhe ju lejon të përdorni pyetjet e LINQ dhe mjete të tjera vendase për të ndërvepruar me të. Këtu mund të gjeni një listë të plotë të ofruesve të bazës së të dhënave për bazat e të dhënave më të njohura relacionale.
Ne do të shkojmë me MongoDB këtu, sepse bazat e të dhënave të dokumenteve NoSQL përkthehen në një List<Object>
mjaft mirë, dhe drejtuesi MongoDB mbështet pyetjet LINQ njësoj si EF Core.
Instaloni paketën MongoDB.Driver:
Krijoni një dosje të re në rrënjë të projektit tuaj të quajtur Models. Në të, krijoni një model entiteti të quajtur User.cs
, i cili do të jetë skema për koleksionin që ruhet në bazën e të dhënave. Ju mund të përdorni atributet [BsonId]
dhe [BsonRepresentation(BsonType.ObjectId)]
për t'i thënë drejtuesit të MongoDB se ky varg ID duhet të interpretohet si ID e koleksionit dhe mund të të kalohet si lloji string
edhe pse Mongo brenda vetes dëshiron të shkruani 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...
}
}
Në të njëjtën dosje, krijoni një skedar të quajtur DatabaseSettings.cs
, i cili do të ruajë një klasë dhe ndërfaqe për cilësimet e bazës së të dhënave.
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; }
}
}
Ne mund t'i plotësojmë këto vlera të vetive në appsettings.json
, duke shtuar konfigurimin e mëposhtëm:
"ExampleDatabaseSettings": {
"ExampleCollectionName": "Users",
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "Example"
}
Sigurisht, do t'ju duhet të krijoni ose riemërtoni bazën e të dhënave Shembull
, si dhe të krijoni koleksionin Përdoruesit
në të.
Së fundi, ne do të shtojmë disa kode në Startup.cs
në metodën ConfigureServices
, i cili do të marrë cilësimet nga skedari appsettings.json
, dhe regjistroni ndërfaqen përmes Dependency Injection:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ExampleDatabaseSettings>(
Configuration.GetSection(nameof(ExampleDatabaseSettings)));
services.AddSingleton<IExampleDatabaseSettings>(sp =>
sp.GetRequiredService<IOptions<ExampleDatabaseSettings>>().Value);
services.AddControllers();
}
Ju do të duhet të shtoni një direktivë në krye duke përdorur hapësirën tuaj të emrave Models.
Shkrimi i një shërbimi të bazës së të dhënave CRUD
Pasi të lidhet baza e të dhënave, mund të shtoni shërbimin që do të flasë. Klasa e mëposhtme përmban një IMongoCollection
që përfaqëson koleksionin MongoDB në një format me të cilin C# mund të ndërveprojë lehtësisht. Leximet, shkrimet, përditësimet dhe fshirjet do të ndikojnë drejtpërdrejt në koleksionin themelor.
Metoda e konstruktorit merr cilësimet e bazës së të dhënave, nis një klient të ri, merr bazën e të dhënave dhe më pas inicializon koleksionin _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);
}
}
Pjesa tjetër e klasës është thjesht një grup operacionesh CRUD për ndërveprim me bazën e të dhënave. Mos ngurroni të zbatoni çdo logjikë të personalizuar këtu.
Përsëri në Startup.cs
, do të dëshironi ta shtoni këtë si shërbim gjatë nisjes:
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();
}
Do t'ju duhet sërish një direktivë tjetër duke përdorur
, këtë herë për Sembulli i Shërbimit.Shërbimet
.
Vendosja e një kontrolluesi API
Më pas, do t'ju duhet një kontrollues për të trajtuar veprimet e API. Për fat Visual Studio e bën këtë të lehtë; mund të klikoni me të djathtën mbi Kontrolluesit për të shtuar një kontrollues të ri, me veprime leximi/shkrimi. Kjo do të krijojë një kontrollues të ri me disa metoda bazë.
Rruga përcaktohet në krye. Si parazgjedhje, kjo është vendosur në /api/controller
, ku kontrolluesi është emri i kontrolluesit (minus pjesën Kontrolluesi). Ju mund ta ndryshoni këtë nëse dëshironi, por ky është një model i mirë për shumicën e njerëzve.
[Route("api/[controller]")]
Ju do të dëshironi të shtoni një referencë për shërbimin tuaj të bazës së të dhënave në krye të klasës dhe ta plotësoni atë në konstruktor:
private readonly ExampleService _exampleService;
public ExampleController(ExampleService exampleService)
{
_exampleService = exampleService;
}
Do të dëshironi të ndryshoni metodën HttpGet për të kthyer një ActionResult
të skemës që po ruani. (Natyrisht, do t'ju duhet të shtoni një referencë në hapësirën tuaj të emrave të Modeleve.) ActionResult është një lloj dinamik që mbështjell ose TVvalue brenda tij, ose një rezultat përgjigjeje HTTP.>
[HttpGet]
public ActionResult<List<User>> Get()
{
return _exampleService.Get();
}
Nëse dëshironi të shtoni një metodë tjetër Get, por në një rrugë tjetër, mund ta kaloni atë si parametër në atributin:
[HttpGet("otherroute")]
public ActionResult<List<User>> GetSomeThingElse()
{
return _exampleService.GetSomeThingElse();
}
Më pas, për metodën HttpPost, telefononi metodën Krijo të shërbimit tuaj të bazës së të dhënave dhe ktheni CreatedAtRoute, e cila do t'i dërgojë një përgjigje 201 klientit duke i informuar ata se krijimi i objektit ishte i suksesshëm.
[HttpPost]
public ActionResult<User> Create(User userIn)
{
_exampleService.Create(userIn);
return CreatedAtRoute("GetUser", new { id = userIn.Id.ToString() }, userIn);
}
Për rrugët e tjera, mund t'i konfiguroni ashtu siç dëshironi. Ideja e përgjithshme është të trajtoni hyrjen e përdoruesit, të kryeni çdo verifikim që ju nevojitet dhe të thirrni veprimet e duhura të bazës së të dhënave, duke i kthyer përdoruesit një diçka të dobishme ose një kod statusi që i tregon se çfarë ka ndodhur.
Sidoqoftë, në këtë pikë, duhet të jeni në gjendje të shtypni butonin e ekzekutimit të IIS Express në krye dhe të testoni API-në. Kjo do të paracaktojë që itinerari të jetë API i shërbimeve të motit që erdhi me bojlerplate, kështu që në vend që ta shtypni çdo herë, mund të ndryshoni rrugën e korrigjimit te Projekti > Karakteristikat > Debug dhe të ndryshoni opsionin Launch Browser.
Pasi të dëshironi të testoni në një server në distancë, mund të krijoni një ndërtim prodhimi nga Build > Publish Service. Zgjidhni daljen e skedarit dhe modifikoni konfigurimin për t'iu përshtatur nevojave tuaja. Për shembull, mund të zgjidhni të ndërtoni si të pavarur, i cili do të paketojë të gjitha varësitë .NET me ndërtimin, dhe gjithashtu të publikojë si një ekzekutues të vetëm. Ju gjithashtu mund të ndryshoni kohëzgjatjen e synuar këtu.
Nëse dëshironi të publikoni në Linux, do t'ju duhet të shtoni një identifikues të kohës së funksionimit në skedarin tuaj .csproj
.
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
Sigurisht, API i paraqitur këtu është i pasigurt. ASP.NET ka një sistem të shkëlqyer vërtetimi, duke ofruar mbështetje për argumentet e bazuara në JWT dhe mund të konfigurohet për të punuar me ofruesit e OAuth si Google dhe Facebook.