Exempel - Skicka data med POST

Post är inte riktigt vad PostNord gör, utan det är ett sätt att skicka data till ett API. Man skickar data till servern, och den skapar eller uppdaterar något baserat på det. Det är som att skicka ett brev där du ber om att få något gjort. Som att trycka chippet på kortet mot betalmaskinen i affären.

🧠 Syfte

Det här exemplet visar hur du skickar ny data till ett API för att skapa en ny resurs. Istället för att bara hämta information (GET), skickar vi nu en “beställning” (POST) och ber servern att skapa något åt oss.

Detta används till exempel när en användare registrerar ett nytt konto, skriver ett blogginlägg eller lägger en produkt i en varukorg.

💻 Koden


using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

// En klass för datan vi vill skicka.
// Vi kan återanvända den för att tolka svaret också.
public class Post
{
    public int UserId { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    // Servern kommer att lägga till ett Id när posten skapas
    public int? Id { get; set; }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        using var client = new HttpClient();

        // 1. Skapa ett C-Sharp-objekt med datan vi vill skicka.
        var newPost = new Post
        {
            UserId = 10,
            Title = "Hallå världen från C-Sharp",
            Body = "Det här är mitt allra första inlägg via ett API!"
        };

        // 2. Serialisera! Omvandla vårt C-Sharp-objekt till en JSON-textsträng.
        string jsonData = JsonSerializer.Serialize(newPost);
        Console.WriteLine("--- JSON vi skickar till API:et ---");
        Console.WriteLine(jsonData);

        // 3. Paketera vår JSON-data för att skickas i HTTP-anropet.
        // Vi måste specificera teckenkodning (UTF8) och mediatyp (application/json).
        var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

        // Adressen vi ska skicka till.
        string url = "[https://jsonplaceholder.typicode.com/posts](https://jsonplaceholder.typicode.com/posts)";

        try
        {
            // 4. Skicka datan med PostAsync och vänta på svar.
            HttpResponseMessage response = await client.PostAsync(url, content);

            // 5. Kontrollera om servern svarade med en framgångs-kod (t.ex. 201 Created).
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("\n--- Success! Servern svarade OK. ---");
                // Läs svaret från servern.
                string responseBody = await response.Content.ReadAsStringAsync();

                Console.WriteLine("\n--- Svar från servern ---");
                Console.WriteLine(responseBody);

                // Vi kan även deserialisera svaret för att få ut det nya ID:t.
                Post? createdPost = JsonSerializer.Deserialize<Post>(responseBody);
                if (createdPost is not null)
                {
                    Console.WriteLine($"\nInlägget skapades med ID: {createdPost.Id}");
                }
            }
            else
            {
                // Om något gick fel (t.ex. 400 Bad Request eller 500 Internal Server Error).
                Console.WriteLine($"\nNågot gick fel! Statuskod: {response.StatusCode}");
            }
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine($"\nNätverksfel: {e.Message}");
        }
    }
}

📋 Förklaring

  1. new Post { ... }: Vi skapar en instans av vår Post-klass. Detta är vår “beställning” i ett C#-format.
  2. JsonSerializer.Serialize(newPost): Detta är motsatsen till Deserialize. Vi tar ett C#-objekt och gör om det till en textsträng i JSON-format.
  3. new StringContent(...): Vi kan inte bara skicka en rå textsträng. Vi måste paketera den i ett StringContent-objekt. Här talar vi om för servern att “det här paketet innehåller text, den är kodad med UTF-8, och formatet är JSON”. Detta är superviktigt för att servern ska förstå vad vi skickar.
  4. client.PostAsync(url, content): Här skickar vi iväg det. Notera att vi nu använder PostAsync istället för GetStringAsync, och vi skickar med vårt content-paket.
  5. response.IsSuccessStatusCode: Till skillnad från GetStringAsync som kastar ett undantag om något går fel, ger PostAsync oss ett HttpResponseMessage-objekt tillbaka. Detta objekt innehåller allt om svaret: statuskod, headers och innehåll. Det är vårt ansvar att kontrollera om anropet lyckades. En lyckad POST resulterar ofta i statuskoden 201 Created.
  6. response.Content.ReadAsStringAsync(): Om anropet lyckades, läser vi svaret som en sträng. Detta kan vara användbart om servern skickar tillbaka information om det skapade objektet, som ett nytt ID.

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.