Gå til indholdet

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:

dotnet new webapi -minimal -o MyApi

Her efter kan du prøve det af (fra MyApi-mappen) med

dotnet run

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:

dotnet run

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.