Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento kurz vytvoří aplikaci, která vydává požadavky HTTP na službu REST na GitHubu. Aplikace čte informace ve formátu JSON a převádí json na objekty jazyka C#. Převod z JSON na objekty jazyka C# se označuje jako deserializace.
V tomto kurzu se dozvíte, jak:
- Odesílání požadavků HTTP
- Deserializace odpovědí JSON
- Nakonfigurujte deserializaci pomocí atributů.
Pokud chcete postupovat podle konečné ukázky pro tento kurz, můžete si ji stáhnout. Pokyny ke stažení najdete ve vzorech a návodech .
Požadavky
- Nejnovější sada .NET SDK
- editor Visual Studio Code editoru
- C# DevKit
Vytvoření klientské aplikace
Otevřete příkazový řádek a vytvořte nový adresář pro vaši aplikaci. Nastavte aktuální adresář.
V okně konzoly zadejte následující příkaz:
dotnet new console --name WebAPIClientTento příkaz vytvoří počáteční soubory pro základní aplikaci Hello World. Název projektu je WebAPIClient.
Přejděte do adresáře WebAPIClient a spusťte aplikaci.
cd WebAPIClientdotnet rundotnet runautomaticky spustídotnet restore, aby se obnovily všechny závislosti, které aplikace potřebuje. V případě potřeby také spustídotnet build. Měl by se zobrazit výstup aplikace"Hello, World!". V terminálu aplikaci zastavíte stisknutím klávesy Ctrl+C.
Vytváření požadavků HTTP
Tato aplikace volá rozhraní API GitHubu, aby získala informace o projektech v rámci .NET Foundation deštníku. Koncový bod je https://api.github.com/orgs/dotnet/repos. K načtení informací se vytvoří požadavek HTTP GET. Prohlížeče také odesílají požadavky HTTP GET, takže tuto adresu URL můžete vložit do adresního řádku prohlížeče a zjistit, jaké informace budete přijímat a zpracovávat.
Pomocí třídy HttpClient proveďte požadavky HTTP. HttpClient podporuje pouze asynchronní metody pro dlouhotrvající API. Následující kroky tedy vytvoří asynchronní metodu a zavolá ji z metody Main.
Otevřete soubor
Program.csv adresáři projektu a nahraďte jeho obsah následujícím kódem:await ProcessRepositoriesAsync(); static async Task ProcessRepositoriesAsync(HttpClient client) { }Tento kód:
- Nahradí příkaz
Console.WriteLinevolánímProcessRepositoriesAsync, který používá klíčové slovoawait. - Definuje prázdnou metodu
ProcessRepositoriesAsync.
- Nahradí příkaz
V
Programtřídě použijte HttpClient ke zpracování požadavků a odpovědí nahrazením obsahu následujícím jazykem C#.using System.Net.Http.Headers; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json")); client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter"); await ProcessRepositoriesAsync(client); static async Task ProcessRepositoriesAsync(HttpClient client) { }Tento kód:
- Nastaví hlavičky HTTP pro všechny požadavky:
- Hlavička
Acceptpro příjem odpovědí JSON - Záhlaví
User-Agent. Tyto hlavičky jsou kontrolovány kódem serveru GitHubu a jsou nezbytné k načtení informací z GitHubu.
- Hlavička
- Nastaví hlavičky HTTP pro všechny požadavky:
V metodě
ProcessRepositoriesAsynczavolejte koncový bod GitHubu, který vrátí seznam všech úložišť v rámci základní organizace .NET:static async Task ProcessRepositoriesAsync(HttpClient client) { var json = await client.GetStringAsync( "https://api.github.com/orgs/dotnet/repos"); Console.Write(json); }Tento kód:
- Očekává úlohu vrácenou voláním metody HttpClient.GetStringAsync(String). Tato metoda odešle požadavek HTTP GET na zadaný identifikátor URI. Tělo odpovědi je vráceno jako String, což je k dispozici po dokončení úkolu.
- Řetězec odpovědi
jsonse vytiskne do konzoly.
Sestavte aplikaci a spusťte ji.
dotnet runNení žádné varování při kompilaci, protože
ProcessRepositoriesAsyncnyní obsahuje operátorawait. Výstup je dlouhý displej textu JSON.
Deserializace výsledku JSON
Následující kroky zjednodušují přístup k načtení a zpracování dat. K načtení a deserializaci výsledků JSON do objektů použijete metodu GetFromJsonAsync rozšíření, která je součástí 📦 balíčku NuGet System.Net.Http.Json .
Vytvořte soubor s názvem Repository.cs a přidejte následující kód:
public record class Repository(string Name);Předchozí kód definuje třídu, která představuje objekt JSON vrácený z rozhraní API GitHubu. Tuto třídu použijete k zobrazení seznamu názvů úložišť.
JSON pro objekt úložiště obsahuje desítky vlastností, ale deserializována bude pouze
Namevlastnost. Serializátor automaticky ignoruje vlastnosti JSON, které nejsou přítomny v cílové třídě. Tato funkce usnadňuje vytváření typů, které pracují pouze s podmnožinou polí ve velkém paketu JSON.I když metoda
GetFromJsonAsync, kterou použijete v dalším bodě, má výhodu, že při názvech vlastností nerozlišuje malá a velká písmena, konvence jazyka C#je velká písmena názvů vlastností.HttpClientJsonExtensions.GetFromJsonAsync Pomocí metody můžete načíst a převést JSON na objekty jazyka C#. Volání GetStringAsync(String) v metodě
ProcessRepositoriesAsyncnahraďte následujícími řádky:var repositories = await client.GetFromJsonAsync<List<Repository>>("https://api.github.com/orgs/dotnet/repos");Aktualizovaný kód nahrazuje GetStringAsync(String)HttpClientJsonExtensions.GetFromJsonAsync.
Prvním argumentem
GetFromJsonAsyncmetodyawaitje výraz.awaitvýrazy se mohou objevit téměř kdekoli ve vašem kódu, i když až dosud jste je viděli jen jako součást příkazu přiřazení. Další parametrrequestUrije volitelný a nemusí být zadán, pokud byl již zadán při vytváření objektuclient. Neposkytliclientjste objekt s identifikátorem URI pro odeslání požadavku, takže jste teď zadali identifikátor URI. Poslední volitelný parametr, kterýCancellationTokenje vynechán v fragmentu kódu.Metoda
GetFromJsonAsyncje obecná, což znamená, že zadáte argumenty pro typ objektů, které by se měly vytvořit z načteného textu JSON. V tomto příkladu deserializujete naList<Repository>, což je další obecný objekt, System.Collections.Generic.List<T>. TřídaList<T>ukládá kolekci objektů. Argument typu deklaruje typ objektů uložených vList<T>. Argument typu je vášRepositoryzáznam, protože text JSON představuje kolekci objektů úložiště.Přidejte kód pro zobrazení názvu každého úložiště. Nahraďte řádky, které čtou:
Console.Write(json);s následujícím kódem:
foreach (var repo in repositories ?? Enumerable.Empty<Repository>()) Console.WriteLine(repo.Name);V horní části souboru by měly být uvedené následující direktivy
using:using System.Net.Http.Headers; using System.Net.Http.Json;Spustit aplikaci.
dotnet runVýstup je seznam názvů úložišť, která jsou součástí .NET Foundation.
Přepsat kód
Metoda ProcessRepositoriesAsync může provádět asynchronní práci a vrátit kolekci úložišť. Změňte metodu tak, aby vrátila Task<List<Repository>>, a přesuňte kód, který zapisuje do konzoly poblíž volajícího.
Změňte podpis
ProcessRepositoriesAsynctak, aby vrátil úkol, jehož výsledkem je seznamRepositoryobjektů:static async Task<List<Repository>> ProcessRepositoriesAsync(HttpClient client)Po zpracování odpovědi JSON vraťte úložiště:
var repositories = await client.GetFromJsonAsync<List<Repository>>("https://api.github.com/orgs/dotnet/repos"); return repositories ?? new();Kompilátor vygeneruje objekt
Task<T>pro vrácenou hodnotu, protože jste tuto metodu označili jakoasync.Upravte soubor Program.cs a nahraďte volání
ProcessRepositoriesAsyncnásledujícím kódem, aby se zachytály výsledky a zapisují názvy jednotlivých úložišť do konzoly.var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) Console.WriteLine(repo.Name);Spustit aplikaci.
Výstup je stejný.
Deserializujte více vlastností
V následujících krocích rozšíříme kód pro zpracování více vlastností z vráceného JSON payloadu GitHub API. Pravděpodobně nebudete muset zpracovat každou vlastnost, ale přidáte několik dalších funkcí jazyka C#.
RepositoryObsah třídy nahraďte následujícírecorddefinicí. Ujistěte se, že naimportujeteSystem.Text.Json.Serializationnamespace a výslovně použijete[JsonPropertyName]atribut pro mapování polí JSON na vlastnosti jazyka C#.using System.Text.Json.Serialization; public record class Repository( string Name, string Description, [property: JsonPropertyName("html_url")] Uri GitHubHomeUrl, Uri Homepage, int Watchers, [property: JsonPropertyName("pushed_at")] DateTime LastPushUtc );Typy Uri a
intmají vestavěné funkce pro převod z řetězcové reprezentace a na ni. K deserializaci z formátu řetězce JSON na tyto cílové typy není potřeba žádný další kód. Pokud paket JSON obsahuje data, která se nepřevedou na cílový typ, vyvolá akce serializace výjimku.JSON často používá
lowercasenebosnake_casepro názvy vlastností. Pole podobnáhtml_urlapushed_atnedodržují konvence pojmenování jazyka C# PascalCase. Použití[JsonPropertyName]zajišťuje, že tyto klíče JSON jsou správně svázané s odpovídajícími vlastnostmi jazyka C#, i když se jejich názvy liší v případě, že obsahují podtržítka. Tento přístup zaručuje předvídatelnou a stabilní deserializaci při povolování názvů vlastností PascalCase v jazyce C#. Kromě tohoGetFromJsonAsyncmetoda jecase-insensitivepři porovnávání názvů vlastností, takže není nutná žádná další konverze.Aktualizujte smyčku
foreachv souboru Program.cs, aby se zobrazily hodnoty vlastností:foreach (var repo in repositories) { Console.WriteLine($"Name: {repo.Name}"); Console.WriteLine($"Homepage: {repo.Homepage}"); Console.WriteLine($"GitHub: {repo.GitHubHomeUrl}"); Console.WriteLine($"Description: {repo.Description}"); Console.WriteLine($"Watchers: {repo.Watchers:#,0}"); Console.WriteLine(); }Spustit aplikaci.
Seznam teď obsahuje další vlastnosti.
Přidejte vlastnost datum
Datum poslední push operace je naformátováno tímto způsobem v rámci JSON odpovědi:
2016-02-08T21:27:00Z
Tento formát je určen pro standard UTC (Coordinated Universal Time), takže výsledkem deserializace je hodnota DateTime, jejíž Kind vlastnost je Utc.
Pokud chcete získat datum a čas reprezentovaný ve vašem časovém pásmu, musíte napsat vlastní metodu převodu.
V Repository.cspřidejte vlastnost pro vyjádření data a času UTC a jen pro čtení
LastPushvlastnost, která vrací datum převedené na místní čas, měl by soubor vypadat takto:using System.Text.Json.Serialization; public record class Repository( string Name, string Description, [property: JsonPropertyName("html_url")] Uri GitHubHomeUrl, Uri Homepage, int Watchers, [property: JsonPropertyName("pushed_at")] DateTime LastPushUtc ) { public DateTime LastPush => LastPushUtc.ToLocalTime(); }Vlastnost
LastPushje definována pomocí výrazu jako členu pro přistupovačget. Není k dispozici žádnýsetpříslušenství. Vynechání přístupového objektusetje jedním ze způsobů, jak definovat vlastnost jen pro čtení v jazyce C#. (Ano, v jazyce C# můžete vytvořit vlastnosti pouze pro zápis, ale jejich hodnota je omezená.)Do Program.cspřidejte další výstupní příkaz: znovu:
Console.WriteLine($"Last push: {repo.LastPush}");Úplná aplikace by měla vypadat podobně jako v následujícím souboru Program.cs:
using System.Net.Http.Headers; using System.Net.Http.Json; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json")); client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter"); var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) { Console.WriteLine($"Name: {repo.Name}"); Console.WriteLine($"Homepage: {repo.Homepage}"); Console.WriteLine($"GitHub: {repo.GitHubHomeUrl}"); Console.WriteLine($"Description: {repo.Description}"); Console.WriteLine($"Watchers: {repo.Watchers:#,0}"); Console.WriteLine($"{repo.LastPush}"); Console.WriteLine(); } static async Task<List<Repository>> ProcessRepositoriesAsync(HttpClient client) { var repositories = await client.GetFromJsonAsync<List<Repository>>("https://api.github.com/orgs/dotnet/repos"); return repositories ?? new List<Repository>(); }Spustit aplikaci.
Výstup zahrnuje datum a čas posledního odeslání do každého úložiště.
Další kroky
V tomto kurzu jste vytvořili aplikaci, která provádí webové požadavky a parsuje výsledky. Vaše verze aplikace by teď měla odpovídat dokončené ukázce .
Zjistěte více o tom, jak konfigurovat serializaci JSON v jak serializovat a deserializovat JSON v .NET.