Aracılığıyla paylaş


HttpClient sınıfıyla HTTP istekleri yapma

Bu makalede, http istekleri yapmayı ve HttpClient sınıfıyla yanıtları işlemeyi öğreneceksiniz.

Önemli

Bu makaledeki örnek HTTP isteklerinin tümü aşağıdaki URL'lerden birini hedefler:

HTTP uç noktaları genellikle JavaScript Nesne Gösterimi (JSON) verilerini döndürür, ancak her zaman döndürmez. Kolaylık olması için, isteğe bağlı System.Net.Http.Json NuGet paketi, HttpContent NuGet paketini kullanarak otomatik serileştirme ve seri durumdan çıkarma gerçekleştiren 📦 ve nesneleri için çeşitli uzantı yöntemleri sağlar. Bu makaledeki örnekler, bu uzantıların kullanılabildiği yerlere dikkat çekmektedir.

İpucu

Bu makalede başvuruda bulunulan tüm kaynak kodu GitHub: .NET Docs deposunda bulunabilir.

HttpClient nesnesi oluşturma

Bu makaledeki örneklerin çoğu aynı HttpClient örneğini yeniden kullanır, böylece örneği bir kez yapılandırabilir ve kalan örnekler için kullanabilirsiniz. HttpClient nesnesi oluşturmak için HttpClient sınıf oluşturucuyu kullanın. Daha fazla bilgi için bkz . HttpClient kullanma yönergeleri.

// 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"),
};

Kod aşağıdaki görevleri tamamlar:

  • Yeni bir HttpClient örneğini static değişkeni olarak oluşturun. yönergelerine göre önerilen yaklaşım, uygulama yaşam döngüsü sırasında HttpClient örnekleri yeniden kullanmaktır.
  • HttpClient.BaseAddress özelliğini "https://jsonplaceholder.typicode.com"olarak ayarlayın.

Bu HttpClient örneği, sonraki istekleri yapmak için temel adresi kullanır. Diğer yapılandırmaları uygulamak için aşağıdaki API'leri göz önünde bulundurun:

İpucu

Alternatif olarak, herhangi bir sayıda istemciyi yapılandırmanıza ve bağımlılık ekleme hizmetleri olarak kullanmanıza olanak tanıyan bir fabrika düzeni yaklaşımı kullanarak HttpClient örnekleri oluşturabilirsiniz. Daha fazla bilgi için bkz .NET ile HTTP istemci fabrikası.

HTTP isteğinde bulunma

HTTP isteğinde bulunmak için aşağıdaki API yöntemlerinden herhangi birini çağırırsınız:

HTTP yöntemi Uygulama Programlama Arayüzü (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

USER SPECIFIED isteği, SendAsync yönteminin geçerli HttpMethod nesnesini kabul ettiğini gösterir.

Uyarı

HTTP isteklerinde bulunmak ağ G/Ç'ye bağlı iş olarak kabul edilir. Zaman uyumlu bir HttpClient.Send yöntemi vardır, ancak buna iyi bir nedeniniz olmadıkça, bunun yerine zaman uyumsuz API'lerin kullanılması önerilir.

Not

Android cihazları hedeflerken (.NET MAUI geliştirmesi gibi), android:usesCleartextTraffic="true" dosyasındaki <application></application> bölümüne tanımını eklemeniz gerekir. Bu ayar, HTTP istekleri gibi, Android güvenlik ilkeleri nedeniyle varsayılan olarak devre dışı bırakılan düz metin trafiğini etkinleştirir. Aşağıdaki örnek XML ayarlarını göz önünde bulundurun:

<?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>

Daha fazla bilgi için Localhost etki alanı için düz metin ağ trafiğini etkinleştirme bölümüne bakın.

HTTP içeriğini anlama

Türü HttpContent , bir HTTP varlık gövdesini ve ilgili içerik üst bilgilerini temsil etmek için kullanılır. Gövde (POST, PUT, PATCH) gerektiren HTTP yöntemleri (veya istek yöntemleri) için, isteğin gövdesini belirtmek için HttpContent sınıfını kullanırsınız. Çoğu örnek, alt sınıfın StringContent bir JSON yüküyle nasıl hazırlayacağını gösterir, ancak farklı içerik (MIME) türleri için başka alt sınıflar vardır.

HttpContent sınıfı, HttpResponseMessage özelliğinden erişilebilen HttpResponseMessage.Content sınıfının yanıt gövdesini temsil etmek için de kullanılır.

HTTP GET isteği kullanma

GET isteği bir içerik göndermemelidir. Bu istek, bir kaynaktan veri almak (veya almak) için (yöntem adından da belirtildiği gibi) kullanılır. bir GET örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için HttpClient.GetAsync yöntemini kullanın:

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
    //   }
}

Kod aşağıdaki görevleri tamamlar:

  • GET isteğini "https://jsonplaceholder.typicode.com/todos/3" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun.
  • İstek ayrıntılarını konsola yazın.
  • Yanıt gövdesini dize olarak okuyun.
  • JSON yanıt gövdesini konsola yazın.

WriteRequestToConsole yöntemi, çerçevenin parçası olmayan özel bir uzantıdır. Uygulamayı merak ediyorsanız aşağıdaki C# kodunu göz önünde bulundurun:

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}");        
    }
}

Bu işlevsellik, istek ayrıntılarını konsola aşağıdaki biçimde yazmak için kullanılır:

<HTTP Request Method> <Request URI> <HTTP/Version>

Örneğin, GET uç noktasına yönelik "https://jsonplaceholder.typicode.com/todos/3" isteği aşağıdaki iletiyi döndürür:

GET https://jsonplaceholder.typicode.com/todos/3 HTTP/1.1

JSON'dan HTTP GET isteği oluşturma

https://jsonplaceholder.typicode.com/todos uç noktası, Todo nesnelerden oluşan bir JSON dizisi döndürür. JSON yapıları aşağıdaki forma benzer:

[
  {
    "userId": 1,
    "id": 1,
    "title": "example title",
    "completed": false
  },
  {
    "userId": 1,
    "id": 2,
    "title": "another example title",
    "completed": true
  },
]

C# Todo nesnesi aşağıdaki gibi tanımlanır:

public record class Todo(
    int? UserId = null,
    int? Id = null,
    string? Title = null,
    bool? Completed = null);

record class türü, isteğe bağlı Id, Title, Completed ve UserId özelliklerine sahiptir. record türü hakkında daha fazla bilgi için, C# dilinde kayıt türlerine giriş bölümüne bakın. GET isteklerini güçlü türde bir C# nesnesine otomatik olarak seri durumdan çıkarmak için, 📦 NuGet paketinin parçası olan uzantı yöntemini kullanın.

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 }
}

Kod aşağıdaki görevleri tamamlar:

  • "https://jsonplaceholder.typicode.com/todos?userId=1&completed=false" için bir GET isteği oluşturun.

    Sorgu dizesi, isteğin filtreleme ölçütlerini temsil eder. Komutun başarılı olmasıyla yanıt otomatik olarak bir List<Todo> nesnesine dönüştürülür.

  • her Todo nesnesiyle birlikte istek ayrıntılarını konsola yazın.

HTTP POST isteği kullanma

İstek POST , işlenmek üzere sunucuya veri gönderir. Content-Type İsteğin üst bilgisi, gövdenin gönderdiği MIME türünü gösterir. bir POST örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için HttpClient.PostAsync yöntemini kullanın:

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
    //   }
}

Kod aşağıdaki görevleri tamamlar:

  • İsteğin JSON gövdesiyle (StringContentMIME türü) bir "application/json" örneği hazırlayın.
  • POST isteğini "https://jsonplaceholder.typicode.com/todos" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.
  • Yanıt içeriğini konsola dize olarak kayıt edin.

HTTP POST isteğini JSON olarak oluşturma

İstek bağımsız değişkenlerini otomatik olarak seri hale getirmek ve yanıtları kesin olarak yazılmış C# nesnelerine dönüştürmek için System.Net.Http.Json NuGet paketinin bir parçası olan uzantı metodunu kullanın.

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 }
}

Kod aşağıdaki görevleri tamamlar:

  • Todo örneğini JSON olarak seri hale getirin ve POST uç noktasına "https://jsonplaceholder.typicode.com/todos" bir istek gönderin.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.
  • Yanıt gövdesini bir Todo örneğine deseriyalize edin ve Todo nesnesini konsola yazın.

HTTP PUT isteği kullanma

PUT istek yöntemi mevcut kaynağın yerini alır veya istek gövdesi yükünü kullanarak yeni bir kaynak oluşturur. bir PUT örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için HttpClient.PutAsync yöntemini kullanın:

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
    //   }
}

Kod aşağıdaki görevleri tamamlar:

  • İsteğin JSON gövdesiyle (StringContentMIME türü) bir "application/json" örneği hazırlayın.
  • PUT isteğini "https://jsonplaceholder.typicode.com/todos/1" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun ve JSON yanıt gövdesiyle istek ayrıntılarını konsola yazın.

HTTP PUT isteğini JSON olarak oluşturma

İstek bağımsız değişkenlerini otomatik olarak seri hale getirmek ve yanıtları kesin olarak yazılmış C# nesnelerine seri durumdan çıkarmak için PutAsJsonAsync System.Net.Http.Json NuGet paketinın bir parçası olan uzantı yöntemini kullanın.

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 }
}

Kod aşağıdaki görevleri tamamlar:

  • Todo örneğini JSON olarak seri hale getirin ve PUT uç noktasına "https://jsonplaceholder.typicode.com/todos/5" bir istek gönderin.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.
  • Yanıt gövdesini bir Todo örneğine deserialize edin ve Todo nesnelerini konsola yazdırın.

HTTP PATCH isteği kullanma

İstek PATCH , var olan bir kaynağın kısmi bir güncelleştirmesidir. Bu istek yeni bir kaynak oluşturmaz ve var olan bir kaynağın yerini almak için tasarlanmamıştır. Bunun yerine, bu yöntem bir kaynağı yalnızca kısmen güncelleştirir. bir PATCH örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için HttpClient.PatchAsync yöntemini kullanın:

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
    //   }
}

Kod aşağıdaki görevleri tamamlar:

  • İsteğin JSON gövdesiyle (StringContentMIME türü) bir "application/json" örneği hazırlayın.
  • PATCH isteğini "https://jsonplaceholder.typicode.com/todos/1" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun ve JSON yanıt gövdesiyle istek ayrıntılarını konsola yazın.

NuGet paketindeki PATCH istekler için System.Net.Http.Json uzantı yöntemi yok.

HTTP DELETE isteği kullanma

DELETE isteği var olan bir kaynağı kaldırır ve istek idempotenttir, ancak güvenli değildir. Aynı kaynaklara yönelik birden çok DELETE isteği aynı sonucu verir, ancak istek kaynağın durumunu etkiler. bir DELETE örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için HttpClient.DeleteAsync yöntemini kullanın:

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
    //   {}
}

Kod aşağıdaki görevleri tamamlar:

  • DELETE isteğini "https://jsonplaceholder.typicode.com/todos/1" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.

İpucu

Bir DELETE isteğine yanıt (PUT isteği gibi) bir gövde içerebilir veya içermeyebilir.

HTTP HEAD isteğini keşfetme

HEAD isteği, GET isteğine benzer. Bu istek, kaynağı döndürmek yerine yalnızca kaynakla ilişkili üst bilgileri döndürür. HEAD isteğine verilen yanıt bir gövde döndürmez. bir HEAD örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için, HttpClient.SendAsync türü HttpMethodolarak ayarlanmış HttpMethod.Head yöntemini kullanın:

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
}

Kod aşağıdaki görevleri tamamlar:

  • HEAD isteğini "https://www.example.com/" uç noktasına yapın.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.
  • Yanıt başlıklarının tamamı üzerinden geçip her bir başlığı konsola yazın.

HTTP SEÇENEKLERİ isteğini keşfetme

İstek OPTIONS , bir sunucunun veya uç noktanın hangi HTTP yöntemlerini desteklediğini belirlemek için kullanılır. bir OPTIONS örneği ve HttpClient nesnesi verilen bir HTTP Uri isteği oluşturmak için, HttpClient.SendAsync türü HttpMethodolarak ayarlanmış HttpMethod.Options yöntemini kullanın:

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
}

Kod aşağıdaki görevleri tamamlar:

  • OPTIONS uç noktasına bir "https://www.example.com/" HTTP isteği gönderin.
  • Yanıtın başarılı olduğundan emin olun ve istek ayrıntılarını konsola yazın.
  • Tüm yanıt içeriği üst bilgileri üzerinde teker teker geçip her üst bilgiyi konsola yazın.

HTTP TRACE isteğini keşfetme

İstek TRACE , istek iletisinde uygulama düzeyinde geri döngü sağladığından hata ayıklama için yararlı olabilir. HTTP TRACE isteğinde bulunmak için HttpRequestMessage türünü kullanarak bir HttpMethod.Trace oluşturun:

using HttpRequestMessage request = new(
    HttpMethod.Trace, 
    "{ValidRequestUri}");

Dikkat

Tüm HTTP sunucuları TRACE HTTP yöntemini desteklemez. Bu yöntem, akıllıca kullanılmadıysa bir güvenlik açığı ortaya çıkarabilir. Daha fazla bilgi için bkz . Open Web Application Security Project (OWASP): Siteler Arası İzleme.

HTTP yanıtını işleme

HTTP yanıtını işlerken, HttpResponseMessage türüyle etkileşim kurarsınız. Yanıtın geçerliliğini değerlendirmek için birkaç üye kullanılır. HTTP durum kodu HttpResponseMessage.StatusCode özelliğinde kullanılabilir.

İstemci örneği verilen bir istek gönderdiğinizi varsayalım:

using HttpResponseMessage response = await httpClient.SendAsync(request);

response OK (HTTP durum kodu 200) olduğundan emin olmak için aşağıdaki örnekte gösterildiği gibi değeri değerlendirebilirsiniz:

if (response is { StatusCode: HttpStatusCode.OK })
{
    // Omitted for brevity...
}

Başarılı bir yanıtı temsil eden (HTTP durum kodu 201), (HTTP durum kodu 202 CREATED ), ACCEPTED (HTTP durum kodu 204) ve NO CONTENT (HTTP durum kodu 205) gibi RESET CONTENT başka HTTP durum kodları da vardır. Bu kodları değerlendirmek için özelliğini de kullanabilirsiniz HttpResponseMessage.IsSuccessStatusCode ve bu da yanıt durum kodunun 200-299 aralığında olmasını sağlar:

if (response.IsSuccessStatusCode)
{
    // Omitted for brevity...
}

Çerçevenin HttpRequestException hatasını oluşturmasını istiyorsanız HttpResponseMessage.EnsureSuccessStatusCode() yöntemini çağırabilirsiniz:

response.EnsureSuccessStatusCode();

Yanıt durum kodu 200-299 aralığında değilse bu kod HttpRequestException bir hata oluşturur.

HTTP geçerli içerik yanıtlarını keşfetme

Geçerli bir yanıtla, Content özelliğini kullanarak yanıt gövdesine erişebilirsiniz. Gövdeye akış, bayt dizisi veya dize olarak erişmek için kullanabileceğiniz bir HttpContent örneği mevcuttur.

Aşağıdaki kod, yanıt gövdesini okumak için responseStream nesnesini kullanır:

await using Stream responseStream =
    await response.Content.ReadAsStreamAsync();

Yanıt gövdesini okumak için farklı nesneler kullanabilirsiniz. Yanıt gövdesini okumak için responseByteArray nesnesini kullanın:

byte[] responseByteArray = await response.Content.ReadAsByteArrayAsync();

Yanıt gövdesini okumak için responseString nesnesini kullanın:

string responseString = await response.Content.ReadAsStringAsync();

HTTP uç noktasının JSON döndürdüğünden emin olduğunuzda, System.Net.Http.Json NuGet paketini kullanarak yanıt gövdesini geçerli bir C# nesnesine seri durumdan çıkarabilirsiniz:

T? result = await response.Content.ReadFromJsonAsync<T>();

Bu kodda result değeri, Ttürü olarak deserilize edilmiş yanıt gövdesidir.

HTTP hata işlemeyi kullanma

HTTP isteği başarısız olduğunda sistem HttpRequestException nesnesini oluşturur. İstisnayı tek başına yakalamak yeterli olmayabilir. Ele almanız gereken başka olası istisnalarla karşılaşabilirsiniz. Örneğin, çağıran kod istek tamamlanmadan önce iptal edilmiş bir iptal belirteci kullanabilir. Bu senaryoda, TaskCanceledException hatasını tespit edebilirsiniz.

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}");
}

Benzer şekilde, bir HTTP isteği gönderdiğinizde, sunucu HttpClient.Timeout değeri aşılmadan önce yanıt vermezse, aynı özel durum oluşturulur. Bu senaryoda, Exception.InnerException hatasını yakalarken TaskCanceledException özelliğini değerlendirerek bir zaman aşımı gerçekleştiğini fark edebilirsiniz.

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}");
}

Kodda, iç özel durum türü TimeoutException olduğunda, zaman aşımı meydana gelir ve iptal belirteci isteği iptal etmez.

HttpRequestException nesnesini yakaladığınızda HTTP durum kodunu değerlendirmek için HttpRequestException.StatusCode özelliğini değerlendirebilirsiniz:

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}");
}

Kodda, yanıt başarılı olmazsa özel durum oluşturması için EnsureSuccessStatusCode() yöntemi çağrılır. Ardından, yanıtın HttpRequestException.StatusCode bir 404 (HTTP durum kodu 404) olup olmadığını belirlemek için özelliği değerlendirilir. HttpClient nesnesinde sizin adınıza örtük olarak EnsureSuccessStatusCode yöntemini çağıran birkaç yardımcı yöntem vardır.

HTTP hatası teslimi için aşağıdaki API'leri göz önünde bulundurun:

İpucu

HttpClient türü döndürmeyen HTTP isteklerinde bulunmak için kullanılan tüm HttpResponseMessage yöntemleri, sizin adınıza örtük olarak EnsureSuccessStatusCode yöntemini çağırır.

Bu yöntemleri çağırdığınızda, HttpRequestException nesnesini işleyebilir ve yanıtın HTTP durum kodunu belirlemek için HttpRequestException.StatusCode özelliğini değerlendirebilirsiniz:

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}");
}

kodunuzda HttpRequestException nesnesi oluşturmanız gereken senaryolar olabilir. HttpRequestException() oluşturucu geneldir ve özel bir iletiyle istisna fırlatmak için bunu kullanabilirsiniz.

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'si yapılandırma

HTTP proxy'si iki yoldan biriyle yapılandırılabilir. Özelliğinde HttpClient.DefaultProxy bir varsayılan belirtilir. Alternatif olarak, HttpClientHandler.Proxy özelliğinde bir proxy belirtebilirsiniz.

Genel varsayılan ara sunucu kullanma

HttpClient.DefaultProxy özelliği, oluşturucusuna geçirilen HttpClient nesnesinde bir ara sunucu açıkça ayarlanmadığı takdirde, tüm HttpClientHandler örneklerinin kullandığı varsayılan ara sunucuyu belirleyen statik bir özelliktir.

Bu özellik tarafından döndürülen varsayılan örnek, platformunuza bağlı olarak farklı bir kural kümesine göre başlatılır:

  • Windows: Ortam değişkenlerinden ara sunucu yapılandırmasını okuyun veya değişkenler tanımlanmamışsa, kullanıcı proxy ayarlarından okuyun.
  • macOS : Ortam değişkenlerinden ara sunucu yapılandırmasını okuyun veya değişkenler tanımlanmamışsa sistem proxy ayarlarından okuyun.
  • Linux: Ortam değişkenlerinden ara sunucu yapılandırmasını okuyun veya değişkenler tanımlanmamışsa, tüm adresleri atlayacak şekilde yapılandırılmamış bir örnek başlatılır.

Windows ve Unix tabanlı platformlarda DefaultProxy özellik başlatma işlemi aşağıdaki ortam değişkenlerini kullanır:

  • HTTP_PROXY: HTTP isteklerinde kullanılan proxy sunucusu.
  • HTTPS_PROXY: HTTPS isteklerinde kullanılan proxy sunucusu.
  • ALL_PROXY: HTTP_PROXY ve/veya HTTPS_PROXY değişkenleri tanımlanmadığında HTTP ve/veya HTTPS isteklerinde kullanılan proxy sunucusu.
  • NO_PROXY: Proxy'lenmesi dışında tutulacak ana bilgisayar adlarının virgülle ayrılmış listesi. Joker karakterler için yıldız işareti desteklenmez. Bir alt etki alanıyla eşleştirmek istediğinizde başındaki noktayı (.) kullanın. Örnekler: NO_PROXY=.example.com (baştaki nokta ile) www.example.comile eşleşir, ancak example.comile eşleşmez. NO_PROXY=example.com (baştaki nokta olmadan) www.example.comile eşleşmiyor. Bu yaklaşım gelecekte diğer ekosistemlerle daha iyi uyumlu hale getirmek için tekrar ele alınabilir.

Ortam değişkenlerinin büyük/küçük harfe duyarlı olduğu sistemlerde değişken adlarının tümü küçük harf veya tümü büyük harf olabilir. Önce küçük harf adları denetleniyor.

Ara sunucu, isteğe bağlı olarak iki nokta üst üste ve bağlantı noktası numarasıyla takip edilen bir ana bilgisayar adı veya IP adresi olabileceği gibi, ara sunucu kimlik doğrulaması için kullanıcı adı ve parolanın isteğe bağlı olarak dahil edildiği bir http URL de olabilir. URL httpdeğil httpsile başlamalıdır ve konak adı, IP veya bağlantı noktasından sonra metin ekleyemez.

İstemci başına ara sunucuyu yapılandırma

HttpClientHandler.Proxy özelliği, İnternet kaynaklarına yönelik istekleri işlemek için kullanılacak WebProxy nesnesini tanımlar. tr-TR: Hiçbir proxy kullanılmaması gerektiğini belirtmek için, Proxy özelliğini GlobalProxySelection.GetEmptyWebProxy() yöntemi tarafından döndürülen proxy örneğine ayarlayın.

Yerel bilgisayar veya uygulama yapılandırma dosyası, varsayılan bir ara sunucunun kullanıldığını belirtebilir. Proxy özelliği belirtilirse, Proxy özelliğindeki ara sunucu ayarları yerel bilgisayarı veya uygulama yapılandırma dosyasını geçersiz kılar ve işleyici belirtilen ara sunucu ayarlarını kullanır. Yapılandırma dosyasında hiçbir ara sunucu belirtilmezse ve Proxy özelliği belirtilmezse, işleyici yerel bilgisayardan devralınan ara sunucu ayarlarını kullanır. Ara sunucu ayarı yoksa istek doğrudan sunucuya gönderilir.

Bu sınıf, HttpClientHandler yerel bilgisayar ayarlarından devralınan joker karakterlere sahip bir vekil atlama listesini ayrıştırır. Örneğin, HttpClientHandler sınıfı, tarayıcılardan "nt*" olarak alınan atlama listesini "nt.*" normal ifadesi olarak ayrıştırır. Bu nedenle, http://nt.com URL'si HttpClientHandler sınıfını kullanarak ara sunucuyu atlar.

HttpClientHandler sınıfı yerel ara sunucu atlamasını destekler. Sınıfı, aşağıdaki koşullardan herhangi biri karşılanırsa hedefi yerel olarak kabul eder:

  • Hedef, URL'de nokta (.) içermeyen düz bir ad barındırır.
  • Hedef bir geri döngü adresi (Loopback veya IPv6Loopback) veya hedef yerel bilgisayara atanmış bir IPAddress özelliği içerir.
  • Hedefin etki alanı soneki, DomainName özelliğinde tanımlandığı gibi yerel bilgisayarın etki alanı soneki ile eşleşir.

Ara sunucu yapılandırma hakkında daha fazla bilgi için aşağıdaki API'lere bakın:

Sonraki adımlar