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:
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
Steam-API
Marvel API (kräver en del egna efterforskningar och krångel – hög svårighetsgrad!)
Last updated
Was this helpful?