Intro til REST API
REST (Representational State Transfer) er en arkitekturstil til at designe netværksapplikationer. Den bruger HTTP-protokollen og dens metoder (GET, POST, PUT, DELETE, osv.) til at kommunikere mellem klient og server. I C# 12 og ASP.NET Core, kan du nemt oprette RESTful APIs, som er lette at vedligeholde og udvide.
Hvad er RESTful API?
Et RESTful API er en API, der følger REST-principperne. Det betyder, at det bruger standard HTTP-metoder til at håndtere ressourcer (som data eller objekter) på serveren. For eksempel:
- GET til at hente data.
- POST til at oprette ny data.
- PUT til at opdatere eksisterende data.
- DELETE til at slette data.
Simpelt eksempel
ASP.NET Core 8 tilbyder en strømlinet måde at oprette RESTful APIs gennem “minimal APIs”. Denne tilgang fokuserer på enkelhed og reducerer boilerplate-koden betydeligt sammenlignet med tidligere versioner.
Oprettelse af et Minimal API
Her er et eksempel på, hvordan du kan oprette et minimalt API med C# 12 og ASP.NET Core 8:
Brug følgende kommando på terminalen til at oprette et nyt projekt:
Her efter kan du prøve det af (fra MyApi-mappen) med
og derefter åbne en browser på den URL der fremgår af terminalen /swagger - evt http://localhost:5381/swagger
- Opret et projekt af typen ASP.NET Core Web Api
- Se evt her hvis du ikke kan finde projektet
- Sørg for at der ikke er kryds i “Configure for https” og “Use controllers” hvis du vil have den helt simple måde at skabe et API
- Tryk på F5.
- Nu burde du kunne se et Swagger interface
Lidt mere brugbart eksempel
Her er et lidt mere brugbart eksempel med udgangspunkt i en simpel person hvor alle de 4 metoder kan bruges (GET, POST, PUT, DELETE):
Oprettelse af et nyt projekt
Brug følgende kommandoer på terminalen til at oprette et nyt projekt:
dotnet new webapi -o MySimpleApi --use-controllers --no-https
cd MySimpleApi
dotnet add package bogus
Tilføjelse af kode
Tilføj klassen PeopleController.cs
til Controller-mappen og indsæt følgende kode:
using Microsoft.AspNetCore.Mvc;
namespace MySimpleApi.Controllers
{
[Route("[controller]")]
[ApiController]
public class PeopleController : ControllerBase
{
static List<Person> People = Person.GetPeople(100).ToList();
[HttpGet(Name = "people")]
public IEnumerable<Person> Get()
{
return People;
}
[HttpGet("{id}", Name = "personById")]
public ActionResult<IEnumerable<Person>> GetPerson(int id)
{
var person = People.FirstOrDefault(p => p.PersonId == id);
if (person != null)
{
return Ok(person);
}
else
{
return NotFound(); // Returns a 404 Not Found response if the person is not found
}
}
[HttpPost]
public ActionResult<IEnumerable<Person>> Post([FromBody] Person person)
{
if (person != null)
{
person.PersonId = People.Max(p => p.PersonId) + 1;
People.Add(person);
return CreatedAtAction(nameof(GetPerson), new { id = person.PersonId }, person);
}
else
{
return BadRequest();
}
}
[HttpPut("{id}")]
public ActionResult<IEnumerable<Person>> Put(int id, [FromBody] Person person)
{
if (person != null)
{
var personToUpdate = People.FirstOrDefault(p => p.PersonId == id);
if (personToUpdate != null)
{
personToUpdate.Name = person.Name;
personToUpdate.BirthDate = person.BirthDate;
personToUpdate.IsEmployed = person.IsEmployed;
personToUpdate.Salary = person.Salary;
return Ok(personToUpdate);
}
else
{
return NotFound();
}
}
else
{
return BadRequest();
}
}
[HttpDelete("{id}")]
public ActionResult<IEnumerable<Person>> Delete(int id)
{
var personToDelete = People.FirstOrDefault(p => p.PersonId == id);
if (personToDelete != null)
{
People.Remove(personToDelete);
return Ok();
}
else
{
return NotFound();
}
}
}
public class Person
{
public int PersonId { get; set; }
public bool IsEmployed { get; set; }
public DateTime BirthDate { get; set; }
public double Salary { get; set; }
public string? Name { get; set; }
public static IEnumerable<Person> GetPeople(int count)
{
Bogus.Randomizer.Seed = new Random(8675309);
for (int i = 0; i < count; i++)
{
Bogus.Faker<Person> faker = new Bogus.Faker<Person>();
faker.RuleFor(p => p.PersonId, f => i + 1);
faker.RuleFor(p => p.IsEmployed, f => f.Random.Bool());
faker.RuleFor(p => p.BirthDate, f => f.Date.Between(new DateTime(1950, 1, 1), new DateTime(2000, 1, 1)).Date);
faker.RuleFor(p => p.Salary, f => f.Random.Int(150000, 1000000));
faker.RuleFor(p => p.Name, f => f.Name.FullName());
yield return faker.Generate();
}
}
}
}
Hjælp til at teste API’et
Overskriv MySimpleApi.http
med følgende kode:
@MySimpleApi_HostAddress = http://localhost:5041
GET {{ MySimpleApi_HostAddress }}/weatherforecast/
Accept: application/json
###
GET {{ MySimpleApi_HostAddress }}/People
Accept: application/json
###
GET {{ MySimpleApi_HostAddress }}/People/1
Accept: application/json
###
POST {{ MySimpleApi_HostAddress }}/People
Content-Type: application/json
{
"name": "abc",
"salary": 100000,
"isEmployed": true,
"birthDate": "2020-01-01T00:00:00.000Z"
}
###
PUT {{ MySimpleApi_HostAddress }}/People/1
Content-Type: application/json
{
"name": "abc",
"salary": 100000,
"isEmployed": true,
"birthDate": "2020-01-01T00:00:00.000Z"
}
Start af API’et
For at starte API’et, skal du køre følgende kommandoer på terminalen:
Herefter vil du kunne åbne http://localhost:5041/swagger i en browser og afprøve API’et, og du vil kunne ramme de enkelte endpoints fra din kode på http://localhost:5041/People.
Afprøvning af API’et med .http-fil
Hvis du åbner projektet i Visual Studio 2022, kan du afprøve API’et direkte fra MySimpleApi.http
-filen. Hvis du åbner det i Visual Studio Code, skal du installere en extension kaldet Rest Client
(humao.rest-client) for at kunne afprøve API’et.
Nu kan du afprøve API’et ved at trykke på Send Request
-knappen i Visual Studio Code/Visual Studio 2022.