MVC och API đŸ±

💡 Vad Ă€r MVC + API?

MVC + API Ă€r som att ha en perfekt restaurang dĂ€r allt fungerar smidigt! đŸœïž

TĂ€nk dig:

  • Kocken (Model) - Lagar maten (hanterar data)
  • Kyparen (Controller) - Tar bestĂ€llningar och koordinerar
  • Matsalen (View) - DĂ€r gĂ€sterna sitter och njuter
  • LeveranstjĂ€nsten (API) - HĂ€mtar ingredienser frĂ„n andra stĂ€llen

I vĂ„rt exempel ska vi bygga en kul app som hĂ€mtar slumpmĂ€ssiga kattfakta frĂ„n internet! đŸŸ

🎯 TL;DR

MVC = organiserad kod med Models, Views, Controllers. API = hÀmta data frÄn andra tjÀnster. Tillsammans = awesome webbappar som kan prata med hela internet!

📋 Efter att ha lĂ€st detta kommer du att kunna

  • FörstĂ„ MVC-arkitekturen pĂ„ riktigt (inte bara teori!) đŸ—ïž
  • Koppla ihop din app med externa API:er 🌐
  • Bygga en komplett webbapp som hĂ€mtar kattfakta đŸ±
  • Följa Single Responsibility Principle (SRP) 📋
  • Hantera HTTP-anrop i ASP.NET MVC ⚡

🔧 MVC-arkitekturen förklarat

De tre vÀnnerna som jobbar tillsammans:

🎭 MODEL = Vad (Data & Logik)

  • HĂ„ller koll pĂ„ all data
  • Vet hur saker ska fungera
  • Pratar med databaser

đŸ‘ïž VIEW = Hur (Utseende & Layout)

  • BestĂ€mmer hur saker ser ut
  • HTML, CSS, anvĂ€ndargrĂ€nssnitt
  • Vad anvĂ€ndaren faktiskt ser

🎼 CONTROLLER = NĂ€r (Koordinatorn)

  • Tar emot förfrĂ„gningar frĂ„n anvĂ€ndare
  • BestĂ€mmer vad som ska hĂ€nda
  • Kopplar ihop Model och View

AnvÀnda Cat Facts API med ASP.NET MVC i C-Sharp

Nu nÀr vi har förstÄtt MVC-arkitekturen kan vi anvÀnda den för att integrera med Cat Facts API i en ASP.NET MVC-applikation i C-Sharp. Cat Facts API ger oss slumpmÀssiga fakta om katter, vilket kan vara ett roligt inslag i vÄr webbapplikation. HÀr Àr ett exempel pÄ hur du kan göra det:

  1. Börja med att skapa ett nytt ASP.NET MVC-projekt i Visual Studio.

  2. LÀgg till en modell som representerar en CatFact. Modellen följer SRP genom att endast innehÄlla egenskaper för att lagra fakta om katter.


public class CatFact
{
    public string Text { get; set; }
    public string Author { get; set; }
}

  1. Skapa en controller som följer SRP genom att endast hantera begÀranden och kommunicera med Cat Facts API.

public class CatFactController : Controller
{
    public async Task<ActionResult> Index()
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync("https://cat-fact.herokuapp.com/facts/random");
            if (response.IsSuccessStatusCode)
            {
                string json = await response.Content.ReadAsStringAsync();
                CatFact catFact = JsonConvert.DeserializeObject<CatFact>(json);
                return View(catFact);
            }
        }

        return View();
    }
}

I exemplet ovan anvÀnds HttpClient-klassen för att göra en GET-förfrÄgan till Cat Facts API och hÀmta en slumpmÀssig faktarad om katter. Den erhÄllna JSON-datan deserialiseras sedan till en CatFact-modell, som skickas till vyn för att visas för anvÀndaren.


@model CatFact

<!DOCTYPE html>
<html>
<head>
    <title>đŸ± Kattfakta Generator</title>
    <style>
        body { font-family: Arial; padding: 20px; background: #f0f8ff; }
        .cat-container { max-width: 600px; margin: 0 auto; }
        .cat-fact { background: white; padding: 20px; border-radius: 10px;
                   box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .refresh-btn { background: #4CAF50; color: white; padding: 10px 20px;
                      border: none; border-radius: 5px; cursor: pointer; }
    </style>
</head>
<body>
    <div class="cat-container">
        <h1>đŸ± Kattfakta Generator</h1>

        @if (Model != null)
        {
            <div class="cat-fact">
                <h2>📚 Visste du att...</h2>
                <p><strong>@Model.Text</strong></p>

                @if (!string.IsNullOrEmpty(Model.Author))
                {
                    <p><em>- @Model.Author</em></p>
                }

                @if (Model.Verified)
                {
                    <span style="color: green;">✅ Verifierad fakta</span>
                }
            </div>
        }
        else if (!string.IsNullOrEmpty(ViewBag.ErrorMessage))
        {
            <div style="color: red; background: #ffe6e6; padding: 10px; border-radius: 5px;">
                <h3>🚹 OjdĂ„!</h3>
                <p>@ViewBag.ErrorMessage</p>
            </div>
        }

        <!-- Knapp för att hÀmta ny kattfakta -->
        <div style="margin-top: 20px;">
            <a href="@Url.Action("Index", "CatFact")" class="refresh-btn">
                🔄 HĂ€mta ny kattfakta!
            </a>
        </div>
</body>
</html>

VIEW ansvar:

  • Visa data snyggt för anvĂ€ndaren
  • Hantera nĂ€r det inte finns data
  • Ge anvĂ€ndaren knappar att klicka pĂ„

⚡ Steg 4: Koppla ihop allt

I Startup.cs eller Program.cs:


// Registrera HttpClient för Dependency Injection
builder.Services.AddHttpClient<CatFactController>();

// LĂ€gg till MVC-support
builder.Services.AddControllersWithViews();

📊 SĂ„ hĂ€r fungerar flödet


1. AnvĂ€ndare klickar "HĂ€mta ny kattfakta" đŸ–±ïž
   ↓
2. Browser skickar request till CatFactController 📹
   ↓
3. Controller gör HTTP-anrop till Cat Facts API 🌐
   ↓
4. API svarar med JSON-data 📩
   ↓
5. Controller deserialiserar till CatFact-objekt 🔄
   ↓
6. Controller skickar data till View 🎭
   ↓
7. View genererar HTML med kattfakta ✹
   ↓
8. AnvĂ€ndaren ser den nya kattfaktan! đŸ˜»

⚠ Vanliga misstag och hur du undviker dem

Misstag 1: Glömma felhantering


// 🚹 FEL - Vad hĂ€nder om API:et Ă€r nere?
public async Task<ActionResult> BadExample()
{
    var response = await _httpClient.GetAsync("https://api.com/data");
    var json = await response.Content.ReadAsStringAsync(); // KRASCHAR!
    return View();
}

// ✅ RÄTT - Alltid kolla om anropet lyckades
public async Task<ActionResult> GoodExample()
{
    try
    {
        var response = await _httpClient.GetAsync("https://api.com/data");
        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            // FortsÀtt bara om allt gick bra
        }
    }
    catch (Exception ex)
    {
        // Hantera fel snyggt
    }
}

Misstag 2: Skapa HttpClient fel


// 🚹 FEL - Skapar ny HttpClient varje gĂ„ng (resurslĂ€ckage!)
public async Task<ActionResult> BadController()
{
    using var client = new HttpClient(); // DÄligt!
}

// ✅ RÄTT - AnvĂ€nd Dependency Injection
public class GoodController : Controller
{
    private readonly HttpClient _httpClient;

    public GoodController(HttpClient httpClient)
    {
        _httpClient = httpClient; // ÅteranvĂ€nder samma klient
    }
}

✹ Fördelar med MVC + API

  • đŸ§© Separation: Varje del har sitt ansvar
  • đŸ§Ș Testbarhet: LĂ€tt att testa varje del för sig
  • 🔄 ÅteranvĂ€ndning: Controllers kan anvĂ€ndas för flera Views
  • 🌐 Skalbarhet: Kan enkelt lĂ€gga till fler API:er
  • đŸ‘„ Teamwork: Olika utvecklare kan jobba pĂ„ olika delar

📚 Sammanfattning

MVC + API = mÀktiga webbappar:

  • Model hĂ„ller data organiserad 🎭
  • View visar information snyggt đŸ‘ïž
  • Controller koordinerar allt 🎼
  • API kopplar oss till hela internet 🌐
  • SRP hĂ„ller koden ren och underhĂ„llbar đŸ§č

🎯 Övningar

  1. 🟱 GrundlĂ€ggande: Bygg kattfakta-appen enligt guiden
  2. 🟡 Utmanande: LĂ€gg till möjlighet att spara favoritfakta
  3. 🔮 Expert: Integrera flera API:er (vĂ€der, nyheter, quotes)

😄 Obligatorisk dad joke

Varför gillar katter MVC-arkitektur?

För att de Ă€lskar separation of con-purr-ns! đŸ±đŸ˜ž


Upp

Upp


Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rÀttigheter förbehÄllna.
Du fÄr anvÀnda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du fÄr inte anvÀnda detta verk för kommersiella ÀndamÄl utan tillstÄnd frÄn upphovsmannen.