RESTful client*

Snabbstart

Nedanstående exempelkod skapar ett klientobjekt och ett requestobjekt, skickar requesten genom klienten för att få ett response, och deserialiserar response-objektets text till en instans av Pokemon-klassen.

using System.Text.Json;

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://pokeapi.co/api/v2/");
HttpResponseMessage result = client.GetAsync("pokemon/ditto").Result;
Pokemon p = JsonSerializer.Deserialize<Pokemon>(result.Content.ReadAsStringAsync().Result);

// Alternativ till de två sista raderna:

Pokemon p = result.Content.ReadAsAsync<Pokemon>().Result;

HttpClient

En klass som sköter kommunikationen med API-servern.

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://pokeapi.co/api/v2/");

Skapar ett klientobjekt som kommer att skicka requests till PokeAPI.

BaseAddress behöver egentligen inte ändras, men det är praktiskt ifall man ska göra många anrop till url:er som börjar på samma sätt.

GetAsync, PostAsync, PutAsync, DelAsync

Dessa metoder används för att skicka en request till en RESTful API-server och leverera resultatet.

Välj rätt metod:

Metod
HTTP-metod
Aktivitet

PostAsync

POST

Skapa en ny resurs

GetAsync

GET

Hämta data om en resurs

PutAsync

PUT

Ändra en resurs

DelAsync

DELETE

Ta bort en resurs

Metoderna tar alla emot en url-sträng och returnerar en Task. Denna Task ger sedan ifrån sig, som Result, ett HttpResponseMessage.

HttpResponseMessage response = client.GetAsync("pokemon/snorlax").Result;

Post och Put vill också ha en body – alltså det som ska skickas in.

using System.Net.Http.Json;

// ---

// Serialisera snorlax till JSON och skicka som body
JsonContent jsonBody = JsonContent.Create<Pokemon>(snorlax);
HttpResponseMessage response = client.PostAsync("pokemon/snorlax", jsonBody).Result;

Många metoder här är asynkrona metod. Med andra ord går det att använda await istället för .Result om man är i en asynkron metod.

async string GetPokemon(string pokemonName)
{
  Task<HttpResponseMessage> task = client.GetAsync($"pokemon/{pokemonName}");
  
  // gör något annat medan klienten hämtar resultatet
  
  await task;
  return task.Result;
}

HttpResponseMessage

Ett HttpResponseMessage-objekt innehåller det svar servern skickat tillbaka.

StatusCode

I response-objektet ingår en StatusCode. Dess datatyp är en Enum som heter HttpStatusCode och finns i biblioteket System.Net. Dess möjliga värden är alla existerande, definierade statuskoder från HTTP-standarden. Till exempel Ok och NotFound.

  if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
  {
    Console.WriteLine("Not found!");
  }

För att slippa skriva System.Net hela tiden kan du använda ett using-statement högst upp i filen:

using System.Net;

Content

Content är det "innehåll" servern svarat med.

// Hämtar content som string-data
string jsonText = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(jsonText);

Ofta är Content JSON eller XML-format, och då kan informationen deserialiseras till ett objekt antingen via JSON-deserialisering eller XML-deserialisering.

Om det är JSON så finns ett enklare sätt – inkludera System.Net.Http.Json och använd ReadFromJsonAsync istället för ReadAsStringAsync.

using System.Net.Http.Json;

HttpClient client = new();
client.BaseAddress = new("https://pokeapi.co/api/v2/");
HttpResponseMessage response = client.GetAsync("pokemon/snorlax").Result;
Pokemon p = response.Content.ReadFromJsonAsync<Pokemon>().Result;

Kommunicera med en lokal server

Om du vill anropa en lokal server (localhost) men får ett felmeddelande om ett SSL-fel, så kan du kör denna kod i terminalen för att det ska fungera:

dotnet dev-certs https --trust

Öppna databas-API:er

Last updated