Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ebből a cikkből megtudhatja, hogyan hozhat létre HTTP-kéréseket, és hogyan kezelheti a válaszokat a HttpClient
osztálysal.
Fontos
A cikkben szereplő összes PÉLDA HTTP-kérés az alábbi URL-címek egyikét célozza meg:
- https://jsonplaceholder.typicode.com: Egy webhely, amely ingyenes hamis API-platformot biztosít teszteléshez és prototípus-készítéshez.
- https://www.example.com: A dokumentumok szemléltető példáiban használható tartomány.
A HTTP-végpontok általában JavaScript Object Notation (JSON) adatokat adnak vissza, de nem mindig. Az opcionális System.Net.Http.Json NuGet-csomag számos bővítménymetódust biztosít HttpClient
és HttpContent
objektumokhoz, amelyek automatikus szerializálást és deszerializálást hajtanak végre a System.Text.Json 📦 NuGet-csomag használatával. A cikkben szereplő példák felhívják a figyelmet azokra a helyekre, ahol ezek a bővítmények elérhetők.
Tipp.
A cikkben hivatkozott összes forráskód elérhető a GitHubon: .NET Docs adattárban.
HttpClient-objektum létrehozása
A cikkben szereplő példák többsége ugyanazt a HttpClient
példányt használja újra, így egyszer konfigurálhatja a példányt, és felhasználhatja a többi példához.
HttpClient
objektum létrehozásához használja a HttpClient
osztálykonstruktort. További információkért tekintse meg a HttpClient használatának irányelveit.
// HttpClient lifecycle management best practices:
// https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines#recommended-use
private static HttpClient sharedClient = new()
{
BaseAddress = new Uri("https://jsonplaceholder.typicode.com"),
};
A kód a következő feladatokat hajtja végre:
- Egy új
HttpClient
példányt hozzon létrestatic
változóként. A irányelvekszerint az ajánlott módszer aHttpClient
példányok újrafelhasználása az alkalmazás életciklusa során. - Állítsa a HttpClient.BaseAddress tulajdonságot
"https://jsonplaceholder.typicode.com"
értékre.
Ez a HttpClient
példány az alapcímet használja a későbbi kérések elvégzéséhez. Más konfigurációk alkalmazásához vegye figyelembe a következő API-kat:
- Állítsa be a HttpClient.DefaultRequestHeaders tulajdonságot.
- Használjon nem alapértelmezett HttpClient.Timeout tulajdonságot.
- Adja meg a HttpClient.DefaultRequestVersion tulajdonságot.
Tipp.
Másik lehetőségként létrehozhat HttpClient
példányokat egy gyári mintaalapú megközelítéssel, amellyel tetszőleges számú ügyfelet konfigurálhat, és függőséginjektálási szolgáltatásként használhatja őket. További információ: HTTP-ügyfél-előállító a .NET-tel.
HTTP-kérés létrehozása
HTTP-kérés indításához hívja meg az alábbi API-metódusok bármelyikét:
HTTP-metódus | Alkalmazásprogramozási interfész (API) |
---|---|
GET |
HttpClient.GetAsync |
GET |
HttpClient.GetByteArrayAsync |
GET |
HttpClient.GetStreamAsync |
GET |
HttpClient.GetStringAsync |
POST |
HttpClient.PostAsync |
PUT |
HttpClient.PutAsync |
PATCH |
HttpClient.PatchAsync |
DELETE |
HttpClient.DeleteAsync |
†USER SPECIFIED |
HttpClient.SendAsync |
†A
USER SPECIFIED
kérés azt jelzi, hogy aSendAsync
metódus bármilyen érvényes HttpMethod objektumot elfogad.
Figyelmeztetés
A HTTP-kérések létrehozása hálózati I/O-kötött munka. Létezik szinkron HttpClient.Send metódus, de a javaslat az aszinkron API-k használata, hacsak nincs rá jó oka.
Feljegyzés
Amikor Android-eszközöket céloz meg (például .NET MAUI fejlesztéssel), hozzá kell adnia a android:usesCleartextTraffic="true"
definíciót a <application></application>
fájl szakaszához. Ez a beállítás lehetővé teszi a tiszta szöveges forgalmat, például a HTTP-kéréseket, amelyek egyébként alapértelmezés szerint le vannak tiltva az Android biztonsági szabályzatai miatt. Vegye figyelembe a következő példa XML-beállításokat:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:usesCleartextTraffic="true"></application>
<!-- omitted for brevity -->
</manifest>
További információ: Clear-text hálózati forgalom engedélyezése a localhost tartomány számára.
HTTP-tartalom ismertetése
A HttpContent típus egy HTTP-entitás törzsét és a megfelelő tartalomfejléceket jelöli. A szövegtörzset (POST
, PUT
, PATCH
) igénylő HTTP-metódusok (vagy kérésmetelyek) esetében a HttpContent osztály használatával adja meg a kérés törzsét. A legtöbb példa bemutatja, hogyan készítse elő az StringContent alosztályt egy JSON hasznos adattal, de más alosztályok léteznek különböző tartalomtípusokhoz (MIME).
- ByteArrayContent: Bájttömbön alapuló HTTP-tartalmat biztosít.
-
FormUrlEncodedContent: HTTP-tartalmat biztosít a
"application/x-www-form-urlencoded"
MIME-típussal kódolt név-érték típusú rekordokhoz. - JsonContent: JSON-alapú HTTP-tartalmat biztosít.
-
MultipartContent: Biztosít egy HttpContent-objektumok gyűjteményt, amelyeket a
"multipart/*"
MIME-típus specifikációjának használatával szerializálnak. -
MultipartFormDataContent: Tárolót biztosít a
"multipart/form-data"
MIME-típussal kódolt tartalomhoz. - ReadOnlyMemoryContent: HTTP-tartalmat biztosít egy ReadOnlyMemory<T> érték alapján.
- StreamContent: HTTP-tartalmat biztosít egy stream alapján.
- StringContent: Sztringen alapuló HTTP-tartalmat biztosít.
A HttpContent
osztály a HttpResponseMessage osztály választörzsét is ábrázolja, amely a HttpResponseMessage.Content tulajdonságban érhető el.
HTTP GET-kérés használata
A GET
kérésnek nem kellene törzset küldenie. Ez a kérés (ahogy a metódus neve is jelzi) az erőforrások adatainak lekérésére (vagy lekérésére) szolgál. HA HTTP-GET
kérést szeretne küldeni egy HttpClient
-példányra és egy Uri objektumra, használja a HttpClient.GetAsync metódust:
static async Task GetAsync(HttpClient httpClient)
{
using HttpResponseMessage response = await httpClient.GetAsync("todos/3");
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var jsonResponse = await response.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonResponse}\n");
// Expected output:
// GET https://jsonplaceholder.typicode.com/todos/3 HTTP/1.1
// {
// "userId": 1,
// "id": 3,
// "title": "fugiat veniam minus",
// "completed": false
// }
}
A kód a következő feladatokat hajtja végre:
- Küldjön egy
GET
kérést a"https://jsonplaceholder.typicode.com/todos/3"
végpontra. - Győződjön meg arról, hogy a válasz sikeres.
- Írja be a kérés részleteit a konzolra.
- Olvassa el a válasz törzsét karakterláncként.
- Írja be a JSON válasz törzsét a konzolra.
A WriteRequestToConsole
metódus egy egyéni bővítmény, amely nem része a keretrendszernek. Ha kíváncsi a megvalósításra, vegye figyelembe a következő C#-kódot:
static class HttpResponseMessageExtensions
{
internal static void WriteRequestToConsole(this HttpResponseMessage response)
{
if (response is null)
{
return;
}
var request = response.RequestMessage;
Console.Write($"{request?.Method} ");
Console.Write($"{request?.RequestUri} ");
Console.WriteLine($"HTTP/{request?.Version}");
}
}
Ez a funkció a kérés részleteinek a konzolra való írására szolgál az alábbi formában:
<HTTP Request Method> <Request URI> <HTTP/Version>
Példaként a GET
végpontra irányuló "https://jsonplaceholder.typicode.com/todos/3"
kérés a következő üzenetet adja ki:
GET https://jsonplaceholder.typicode.com/todos/3 HTTP/1.1
A HTTP GET kérés létrehozása a JSON-ból
A https://jsonplaceholder.typicode.com/todos végpont egy JSON-tömböt ad vissza Todo
objektumokból. JSON-struktúrájuk a következő formára hasonlít:
[
{
"userId": 1,
"id": 1,
"title": "example title",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "another example title",
"completed": true
},
]
A C# Todo
objektum a következőképpen van definiálva:
public record class Todo(
int? UserId = null,
int? Id = null,
string? Title = null,
bool? Completed = null);
Ez egy record class
típus, választhatóId
, Title
és Completed
UserId
tulajdonságokkal rendelkezik. A típusról további információt a record
C# rekordtípusainak bemutatása című témakörben talál. Ha automatikusan deszerializálni szeretné GET
kéréseket egy erősen típusos C# objektumba, használja a GetFromJsonAsync NuGet-csomag részét képező 📦 kiterjesztési metódust.
static async Task GetFromJsonAsync(HttpClient httpClient)
{
var todos = await httpClient.GetFromJsonAsync<List<Todo>>(
"todos?userId=1&completed=false");
Console.WriteLine("GET https://jsonplaceholder.typicode.com/todos?userId=1&completed=false HTTP/1.1");
todos?.ForEach(Console.WriteLine);
Console.WriteLine();
// Expected output:
// GET https://jsonplaceholder.typicode.com/todos?userId=1&completed=false HTTP/1.1
// Todo { UserId = 1, Id = 1, Title = delectus aut autem, Completed = False }
// Todo { UserId = 1, Id = 2, Title = quis ut nam facilis et officia qui, Completed = False }
// Todo { UserId = 1, Id = 3, Title = fugiat veniam minus, Completed = False }
// Todo { UserId = 1, Id = 5, Title = laboriosam mollitia et enim quasi adipisci quia provident illum, Completed = False }
// Todo { UserId = 1, Id = 6, Title = qui ullam ratione quibusdam voluptatem quia omnis, Completed = False }
// Todo { UserId = 1, Id = 7, Title = illo expedita consequatur quia in, Completed = False }
// Todo { UserId = 1, Id = 9, Title = molestiae perspiciatis ipsa, Completed = False }
// Todo { UserId = 1, Id = 13, Title = et doloremque nulla, Completed = False }
// Todo { UserId = 1, Id = 18, Title = dolorum est consequatur ea mollitia in culpa, Completed = False }
}
A kód a következő feladatokat hajtja végre:
Készíts egy
GET
kérést"https://jsonplaceholder.typicode.com/todos?userId=1&completed=false"
-nek.A lekérdezési sztring a kérelem szűrési feltételeit jelöli. Ha a parancs sikeres, a válasz automatikusan deszerializálódik egy
List<Todo>
objektumba.Írja be a kérés részleteit a konzolra az egyes
Todo
objektumokkal együtt.
HTTP POST-kérés használata
A POST
kérelem adatokat küld a kiszolgálónak feldolgozás céljából. A Content-Type
kérés fejléce azt jelzi, hogy milyen MIME-típust küld a törzs. HA HTTP-POST
kérést szeretne küldeni egy HttpClient
-példányra és egy Uri objektumra, használja a HttpClient.PostAsync metódust:
static async Task PostAsync(HttpClient httpClient)
{
using StringContent jsonContent = new(
JsonSerializer.Serialize(new
{
userId = 77,
id = 1,
title = "write code sample",
completed = false
}),
Encoding.UTF8,
"application/json");
using HttpResponseMessage response = await httpClient.PostAsync(
"todos",
jsonContent);
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var jsonResponse = await response.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonResponse}\n");
// Expected output:
// POST https://jsonplaceholder.typicode.com/todos HTTP/1.1
// {
// "userId": 77,
// "id": 201,
// "title": "write code sample",
// "completed": false
// }
}
A kód a következő feladatokat hajtja végre:
- Készítsen elő egy StringContent példányt a kérelem JSON-törzsével (
"application/json"
MIME típusa). - Küldjön egy
POST
kérést a"https://jsonplaceholder.typicode.com/todos"
végpontra. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
- Írja a válasz törzsét karakterláncként a konzolra.
A HTTP POST-kérelem létrehozása JSON-ként
A kérelemargumentumok automatikus szerializálásához POST
és a válaszok erős C#-objektumokba való deszerializálásához használja a PostAsJsonAsyncSystem.Net.Http.Json NuGet-csomag részét képező bővítménymetódust.
static async Task PostAsJsonAsync(HttpClient httpClient)
{
using HttpResponseMessage response = await httpClient.PostAsJsonAsync(
"todos",
new Todo(UserId: 9, Id: 99, Title: "Show extensions", Completed: false));
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var todo = await response.Content.ReadFromJsonAsync<Todo>();
Console.WriteLine($"{todo}\n");
// Expected output:
// POST https://jsonplaceholder.typicode.com/todos HTTP/1.1
// Todo { UserId = 9, Id = 201, Title = Show extensions, Completed = False }
}
A kód a következő feladatokat hajtja végre:
- Szerializálja a
Todo
-példányt JSON-ként, és küldjön egyPOST
kérést a"https://jsonplaceholder.typicode.com/todos"
végponthoz. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
- Deszerializálja a választörzset egy
Todo
-példányba, és írja be aTodo
objektumot a konzolra.
HTTP PUT-kérés használata
A PUT
kérések módszere lecserélhet egy meglévő erőforrást, vagy létrehozhat egy újat a kérés törzsének tartalmával. HA HTTP-PUT
kérést szeretne küldeni egy HttpClient
-példányra és egy Uri objektumra, használja a HttpClient.PutAsync metódust:
static async Task PutAsync(HttpClient httpClient)
{
using StringContent jsonContent = new(
JsonSerializer.Serialize(new
{
userId = 1,
id = 1,
title = "foo bar",
completed = false
}),
Encoding.UTF8,
"application/json");
using HttpResponseMessage response = await httpClient.PutAsync(
"todos/1",
jsonContent);
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var jsonResponse = await response.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonResponse}\n");
// Expected output:
// PUT https://jsonplaceholder.typicode.com/todos/1 HTTP/1.1
// {
// "userId": 1,
// "id": 1,
// "title": "foo bar",
// "completed": false
// }
}
A kód a következő feladatokat hajtja végre:
- Készítsen elő egy StringContent példányt a kérelem JSON-törzsével (
"application/json"
MIME típusa). - Küldjön egy
PUT
kérést a"https://jsonplaceholder.typicode.com/todos/1"
végpontra. - Győződjön meg arról, hogy a válasz sikeres, és írja meg a kérés részleteit a JSON válasz törzsével a konzolra.
A HTTP PUT-kérelem létrehozása JSON-ként
A kérelemargumentumok automatikus szerializálásához PUT
és a válaszok erős C#-objektumokba való deszerializálásához használja a PutAsJsonAsyncSystem.Net.Http.Json NuGet-csomag részét képező bővítménymetódust.
static async Task PutAsJsonAsync(HttpClient httpClient)
{
using HttpResponseMessage response = await httpClient.PutAsJsonAsync(
"todos/5",
new Todo(Title: "partially update todo", Completed: true));
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var todo = await response.Content.ReadFromJsonAsync<Todo>();
Console.WriteLine($"{todo}\n");
// Expected output:
// PUT https://jsonplaceholder.typicode.com/todos/5 HTTP/1.1
// Todo { UserId = , Id = 5, Title = partially update todo, Completed = True }
}
A kód a következő feladatokat hajtja végre:
- Szerializálja a
Todo
-példányt JSON-ként, és küldjön egyPUT
kérést a"https://jsonplaceholder.typicode.com/todos/5"
végponthoz. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
- Deszerializálja a válasz törzsét egy
Todo
-példányba, és írja be aTodo
objektumokat a konzolra.
HTTP PATCH-kérés használata
A PATCH
kérés egy meglévő erőforrás részleges frissítése. Ez a kérés nem hoz létre új erőforrást, és nem egy meglévő erőforrás cseréjére szolgál. Ehelyett ez a módszer csak részben frissíti az erőforrást. HA HTTP-PATCH
kérést szeretne küldeni egy HttpClient
-példányra és egy Uri objektumra, használja a HttpClient.PatchAsync metódust:
static async Task PatchAsync(HttpClient httpClient)
{
using StringContent jsonContent = new(
JsonSerializer.Serialize(new
{
completed = true
}),
Encoding.UTF8,
"application/json");
using HttpResponseMessage response = await httpClient.PatchAsync(
"todos/1",
jsonContent);
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var jsonResponse = await response.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonResponse}\n");
// Expected output
// PATCH https://jsonplaceholder.typicode.com/todos/1 HTTP/1.1
// {
// "userId": 1,
// "id": 1,
// "title": "delectus aut autem",
// "completed": true
// }
}
A kód a következő feladatokat hajtja végre:
- Készítsen elő egy StringContent példányt a kérelem JSON-törzsével (
"application/json"
MIME típusa). - Küldjön egy
PATCH
kérést a"https://jsonplaceholder.typicode.com/todos/1"
végpontra. - Győződjön meg arról, hogy a válasz sikeres, és írja meg a kérés részleteit a JSON válasz törzsével a konzolra.
A PATCH
NuGet-csomagban lévő System.Net.Http.Json
kérésekhez nem léteznek bővítési metódusok.
HTTP DELETE-kérés használata
A DELETE
kérés eltávolít egy meglévő erőforrást, és a kérés idempotens, de nem biztonságos. Ugyanahhoz az erőforráshoz több DELETE
kérés is ugyanazt az eredményt adja, de a kérés hatással van az erőforrás állapotára. HA HTTP-DELETE
kérést szeretne küldeni egy HttpClient
-példányra és egy Uri objektumra, használja a HttpClient.DeleteAsync metódust:
static async Task DeleteAsync(HttpClient httpClient)
{
using HttpResponseMessage response = await httpClient.DeleteAsync("todos/1");
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
var jsonResponse = await response.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonResponse}\n");
// Expected output
// DELETE https://jsonplaceholder.typicode.com/todos/1 HTTP/1.1
// {}
}
A kód a következő feladatokat hajtja végre:
- Küldjön egy
DELETE
kérést a"https://jsonplaceholder.typicode.com/todos/1"
végpontra. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
Tipp.
Egy DELETE
kérésre adott válasz (akárcsak egy PUT
kérés) tartalmazhat vagy nem tartalmazhat törzset.
A HTTP HEAD-kérelem megismerése
A HEAD
kérés hasonló a GET
kéréshez. Az erőforrás visszaadása helyett ez a kérés csak az erőforráshoz társított fejléceket adja vissza. A HEAD
kérésre adott válasz nem ad vissza tartalmat. HA HTTP-HEAD
kérést szeretne készíteni egy HttpClient
-példány és egy Uri objektum alapján, használja a HttpClient.SendAsync metódust a HttpMethodHttpMethod.Head
típusával:
static async Task HeadAsync(HttpClient httpClient)
{
using HttpRequestMessage request = new(
HttpMethod.Head,
"https://www.example.com");
using HttpResponseMessage response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
foreach (var header in response.Headers)
{
Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}");
}
Console.WriteLine();
// Expected output:
// HEAD https://www.example.com/ HTTP/1.1
// Accept-Ranges: bytes
// Age: 550374
// Cache-Control: max-age=604800
// Date: Wed, 10 Aug 2022 17:24:55 GMT
// ETag: "3147526947"
// Server: ECS, (cha / 80E2)
// X-Cache: HIT
}
A kód a következő feladatokat hajtja végre:
- Küldjön egy
HEAD
kérést a"https://www.example.com/"
végpontra. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
- Iterálja át az összes válaszfejlécet, és írja az egyes fejléceket a konzolra.
A HTTP-BEÁLLÍTÁSOK kérés megismerése
A OPTIONS
kérés a kiszolgáló vagy végpont által támogatott HTTP-metódusok azonosítására szolgál. HA HTTP-OPTIONS
kérést szeretne készíteni egy HttpClient
-példány és egy Uri objektum alapján, használja a HttpClient.SendAsync metódust a HttpMethodHttpMethod.Options
típusával:
static async Task OptionsAsync(HttpClient httpClient)
{
using HttpRequestMessage request = new(
HttpMethod.Options,
"https://www.example.com");
using HttpResponseMessage response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode()
.WriteRequestToConsole();
foreach (var header in response.Content.Headers)
{
Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}");
}
Console.WriteLine();
// Expected output
// OPTIONS https://www.example.com/ HTTP/1.1
// Allow: OPTIONS, GET, HEAD, POST
// Content-Type: text/html; charset=utf-8
// Expires: Wed, 17 Aug 2022 17:28:42 GMT
// Content-Length: 0
}
A kód a következő feladatokat hajtja végre:
- Küldjön egy
OPTIONS
HTTP-kérést a"https://www.example.com/"
végpontnak. - Győződjön meg arról, hogy a válasz sikeres, és írja be a kérés részleteit a konzolra.
- Iterálja át az összes választartalom-fejlécet, és írja be az egyes fejléceket a konzolra.
A HTTP TRACE-kérés megismerése
A TRACE
kérés hasznos lehet a hibakereséshez, mivel alkalmazásszintű visszacsatolást biztosít a kérési üzenethez. HTTP-TRACE
kérés létrehozásához hozzon létre egy HttpRequestMessage a HttpMethod.Trace
típusával:
using HttpRequestMessage request = new(
HttpMethod.Trace,
"{ValidRequestUri}");
Figyelemfelhívás
Nem minden HTTP-kiszolgáló támogatja a TRACE
HTTP-metódust. Ez a módszer biztonsági rést tehet közzé, ha nem megfelelő módon használják. További információ: Open Web Application Security Project (OWASP): Cross Site Tracing.
HTTP-válasz kezelése
HTTP-válasz kezelésekor a HttpResponseMessage típussal lép kapcsolatba. A rendszer több taggal értékeli a válasz érvényességét. A HTTP-állapotkód a HttpResponseMessage.StatusCode tulajdonságban érhető el.
Tegyük fel, hogy egy ügyfélpéldányra vonatkozó kérést küld:
using HttpResponseMessage response = await httpClient.SendAsync(request);
Annak érdekében, hogy a response
OK
legyen (HTTP-állapotkód: 200), kiértékelheti az értéket az alábbi példában látható módon:
if (response is { StatusCode: HttpStatusCode.OK })
{
// Omitted for brevity...
}
Vannak más HTTP-állapotkódok is, amelyek sikeres választ jelentenek, például CREATED
(HTTP-állapotkód: 201), ACCEPTED
(HTTP-állapotkód: 202), NO CONTENT
(HTTP-állapotkód: 204) és RESET CONTENT
(HTTP-állapotkód: 205). A tulajdonság segítségével ezeket a HttpResponseMessage.IsSuccessStatusCode kódokat is kiértékelheti, ami biztosítja, hogy a válasz állapotkódja a 200–299 tartományon belül legyen:
if (response.IsSuccessStatusCode)
{
// Omitted for brevity...
}
Ha a keretrendszernek HttpRequestException hibát kell jeleznie, meghívhatja a HttpResponseMessage.EnsureSuccessStatusCode() metódust:
response.EnsureSuccessStatusCode();
Ez a kód HttpRequestException
hibát jelez, ha a válasz állapotkódja nem a 200–299 tartományon belül van.
A HTTP érvényes tartalomválaszainak felfedezése
Érvényes válasz esetén a választörzset a Content tulajdonsággal érheti el. A törzs HttpContent-példányként érhető el, amellyel streamként, bájttömbként vagy sztringként érheti el a törzset.
A következő kód a responseStream
objektummal olvassa be a válasz törzsét:
await using Stream responseStream =
await response.Content.ReadAsStreamAsync();
A válasz törzsének olvasásához különböző objektumokat használhat. A válasz törzsének olvasásához használja a responseByteArray
objektumot:
byte[] responseByteArray = await response.Content.ReadAsByteArrayAsync();
A válasz törzsének olvasásához használja a responseString
objektumot:
string responseString = await response.Content.ReadAsStringAsync();
Ha tudja, hogy egy HTTP-végpont JSON-t ad vissza, a választörzset bármilyen érvényes C#-objektumba deszerializálhatja a System.Net.Http.Json NuGet-csomag használatával:
T? result = await response.Content.ReadFromJsonAsync<T>();
Ebben a kódban a result
érték a választörzs deszerializált típusa T
.
HTTP-hibakezelés használata
Ha egy HTTP-kérés meghiúsul, a rendszer eldobja a HttpRequestException objektumot. Előfordulhat, hogy a kivétel elfogása önmagában nem elegendő. Vannak más lehetséges kivételek is, amelyeket érdemes megfontolni, hogyan kezeljük. Előfordulhat például, hogy a hívó kód egy lemondási jogkivonatot használ, amelyet a kérés befejezése előtt töröltek. Ebben a forgatókönyvben a TaskCanceledException hibát észlelheti:
using var cts = new CancellationTokenSource();
try
{
// Assuming:
// httpClient.Timeout = TimeSpan.FromSeconds(10)
using var response = await httpClient.GetAsync(
"http://localhost:5001/sleepFor?seconds=100", cts.Token);
}
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
{
// When the token has been canceled, it is not a timeout.
Console.WriteLine($"Canceled: {ex.Message}");
}
Hasonlóképpen, amikor HTTP-kérést küld, ha a kiszolgáló nem válaszol a HttpClient.Timeout érték túllépése előtt, ugyanaz a kivétel lesz dobva. Ebben a forgatókönyvben felismerheti az időtúllépés tényét, ha kiértékeli a Exception.InnerException tulajdonságot a TaskCanceledException hiba észlelésénél.
try
{
// Assuming:
// httpClient.Timeout = TimeSpan.FromSeconds(10)
using var response = await httpClient.GetAsync(
"http://localhost:5001/sleepFor?seconds=100");
}
catch (OperationCanceledException ex) when (ex.InnerException is TimeoutException tex)
{
Console.WriteLine($"Timed out: {ex.Message}, {tex.Message}");
}
A kódban, ha a belső kivétel TimeoutException típusú, akkor időtúllépés történt, és a megszakítási token nem mondja le a kérést.
A HTTP-állapotkód kiértékeléséhez a HttpRequestException objektum elfogásakor kiértékelheti a HttpRequestException.StatusCode tulajdonságot:
try
{
// Assuming:
// httpClient.Timeout = TimeSpan.FromSeconds(10)
using var response = await httpClient.GetAsync(
"http://localhost:5001/doesNotExist");
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex) when (ex is { StatusCode: HttpStatusCode.NotFound })
{
// Handle 404
Console.WriteLine($"Not found: {ex.Message}");
}
A kódban a EnsureSuccessStatusCode() metódus kivételt eredményez, ha a válasz nem sikeres. A HttpRequestException.StatusCode tulajdonságot ezután kiértékelik annak megállapítására, hogy a válasz 404
volt-e (HTTP-állapotkód: 404). Az HttpClient
objektumon számos segédmetódus található, amelyek implicit módon meghívják a EnsureSuccessStatusCode
metódust az Ön nevében.
HTTP-hiba átadása esetén vegye figyelembe a következő API-kat:
- HttpClient.GetByteArrayAsync eljárás
- HttpClient.GetStreamAsync eljárás
- HttpClient.GetStringAsync eljárás
Tipp.
Az összes HttpClient
metódus, amely olyan HTTP-kérések készítésére szolgál, amelyek nem adnak vissza HttpResponseMessage
típust, implicit módon meghívják a EnsureSuccessStatusCode
metódust az Ön nevében.
Amikor meghívja ezeket a metódusokat, kezelheti a HttpRequestException
objektumot, és kiértékelheti a HttpRequestException.StatusCode tulajdonságot a válasz HTTP-állapotkódjának meghatározásához:
try
{
// These extension methods will throw HttpRequestException
// with StatusCode set when the HTTP request status code isn't 2xx:
//
// GetByteArrayAsync
// GetStreamAsync
// GetStringAsync
using var stream = await httpClient.GetStreamAsync(
"https://localhost:5001/doesNotExists");
}
catch (HttpRequestException ex) when (ex is { StatusCode: HttpStatusCode.NotFound })
{
// Handle 404
Console.WriteLine($"Not found: {ex.Message}");
}
Előfordulhatnak olyan helyzetek, amikor a HttpRequestException objektumot a kódba kell dobnia. A HttpRequestException() konstruktor nyilvános, és használatával kivételt állíthat be egy egyéni üzenettel:
try
{
using var response = await httpClient.GetAsync(
"https://localhost:5001/doesNotExists");
// Throw for anything higher than 400.
if (response is { StatusCode: >= HttpStatusCode.BadRequest })
{
throw new HttpRequestException(
"Something went wrong", inner: null, response.StatusCode);
}
}
catch (HttpRequestException ex) when (ex is { StatusCode: HttpStatusCode.NotFound })
{
Console.WriteLine($"Not found: {ex.Message}");
}
HTTP-proxy konfigurálása
A HTTP-proxyk kétféleképpen konfigurálhatók. A tulajdonságon HttpClient.DefaultProxy alapértelmezett érték van megadva. Másik lehetőségként megadhat egy proxyt a HttpClientHandler.Proxy tulajdonságon.
Globális alapértelmezett proxy használata
A HttpClient.DefaultProxy
tulajdonság egy statikus tulajdonság, amely meghatározza az összes HttpClient
példány által használt alapértelmezett proxyt, ha a konstruktoron áthaladó HttpClientHandler objektumban nincs explicit módon beállítva proxy.
A tulajdonság által visszaadott alapértelmezett példány a platformtól függően eltérő szabályok szerint inicializálható:
- Windows: Olvassa el a proxykonfigurációt a környezeti változókból, vagy ha nincsenek definiálva változók, olvassa be a felhasználói proxybeállításokból.
- macOS: Olvassa el a proxykonfigurációt a környezeti változókból, vagy ha nincsenek definiálva változók, olvassa el a rendszerproxy-beállításokból.
- Linux-: Olvassa el a proxykonfigurációt a környezeti változókból, vagy ha nincsenek definiálva változók, inicializáljon egy nem konfigurált példányt az összes cím megkerüléséhez.
A DefaultProxy
tulajdonság inicializálása Windows- és Unix-alapú platformokon a következő környezeti változókat használja:
-
HTTP_PROXY
: A HTTP-kérelmekhez használt proxykiszolgáló. -
HTTPS_PROXY
: A HTTPS-kérelmekhez használt proxykiszolgáló. -
ALL_PROXY
: A HTTP- és/vagy HTTPS-kérelmekben használt proxykiszolgáló, ha aHTTP_PROXY
és/vagyHTTPS_PROXY
változók nincsenek definiálva. -
NO_PROXY
: A proxyzásból kizárandó gazdagépnevek vesszővel tagolt listája. A csillagokat nem támogatják helyettesítő karakterekként. Ha egy altartományt szeretne egyeztetni, használjon vezető pontot (.). Példák:NO_PROXY=.example.com
(kezdő periódussal) egyezikwww.example.com
, de nem egyezikexample.com
.NO_PROXY=example.com
(vezető pont nélkül) nem egyezik megwww.example.com
. Ezt a viselkedést a jövőben újra lehet majd áttekinteni, hogy jobban illeszkedjenek más ökoszisztémákhoz.
Azokban a rendszerekben, ahol a környezeti változók megkülönböztetik a kis- és nagybetűket, a változónevek kis- vagy nagybetűk is lehetnek. Először a kisbetűs nevek lesznek bejelölve.
A proxykiszolgáló lehet gazdagépnév vagy IP-cím, amelyet opcionálisan kettőspont és portszám követ, vagy lehet egy http
URL-cím, opcionálisan a proxyhitelesítéshez használt felhasználónévvel és jelszóval. Az URL-címnek http
kell kezdődnie, nem https
, és nem tartalmazhat szöveget a gazdagépnév, az IP-cím vagy a port után.
A proxy konfigurálása ügyfélenként
A HttpClientHandler.Proxy tulajdonság azonosítja azt a WebProxy objektumot, amely az internetes erőforrásokra irányuló kérelmek feldolgozásához használható. Ha meg szeretné adni, hogy ne használjon proxyt, állítsa a Proxy
tulajdonságot a metódus által visszaadott proxypéldányra GlobalProxySelection.GetEmptyWebProxy() .
A helyi számítógép- vagy alkalmazáskonfigurációs fájl megadhat egy alapértelmezett proxyt. Ha a Proxy
tulajdonság meg van adva, akkor a Proxy
tulajdonság proxybeállításai felülbírálják a helyi számítógép- vagy alkalmazáskonfigurációs fájlt, és a kezelő a megadott proxybeállításokat használja. Ha nincs megadva proxy egy konfigurációs fájlban, és a Proxy
tulajdonság nincs meghatározva, a kezelő a helyi számítógéptől örökölt proxybeállításokat használja. Ha nincsenek proxybeállítások, a rendszer közvetlenül a kiszolgálónak küldi el a kérést.
Az HttpClientHandler osztály a proxy megkerülőlistát elemzi, amely joker karaktereket tartalmaz, amelyeket a helyi számítógép beállításaitól örökölt. Például a HttpClientHandler
osztály a böngészők megkerülési listáját "nt*"
normál kifejezésként "nt.*"
elemzi. Ezért a http://nt.com
URL-címe a HttpClientHandler
osztály használatával megkerüli a proxyt.
Az HttpClientHandler
osztály támogatja a helyi proxy megkerülését. Az osztály helyinek tekinti a célhelyet, ha az alábbi feltételek bármelyike teljesül:
- A cél egy egyszerű nevet tartalmaz (nincs pont (.) az URL-címben.
- A cél egy visszacsatolási címet (Loopback vagy IPv6Loopback) tartalmaz, vagy a cél egy IPAddress tulajdonságot tartalmaz, amely a helyi számítógéphez van hozzárendelve.
- A cél tartomány utótagja megegyezik a helyi számítógép tartomány-utótagjával, a DomainName tulajdonságban meghatározottak szerint.
A proxy konfigurálásával kapcsolatos további információkért tekintse meg a következő API-kat:
- WebProxy.Address tulajdonság
- WebProxy.BypassProxyOnLocal tulajdonság
- WebProxy.BypassArrayList tulajdonság