RESTful client*
Last updated
Was this helpful?
Last updated
Was this helpful?
Was this helpful?
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;
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.
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;
}
Ett HttpResponseMessage-objekt innehåller det svar servern skickat tillbaka.
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 ä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;
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
Steam-API
Marvel API (kräver en del egna efterforskningar och krångel – hög svårighetsgrad!)