Туториал по HttpClient

Туториал по C # HttpClient, сегодня мы научимся создавать HTTP-запросы с помощью HttpClient в C #. В примерах мы создаем простые запросы GET и POST. Протокол передачи гипертекста (HTTP) — это прикладной протокол для распределенных, совместных информационных систем. HTTP является основой передачи данных для World Wide Web. HttpClient — это базовый класс для отправки HTTP-запросов и получения HTTP-ответов от ресурса, идентифицированного URI.

Получаем код состояния

Коды состояния ответа HTTP указывают, был ли конкретный запрос HTTP успешно выполнен. Ответы сгруппированы в пять классов:

  • Информационные ответы (100–199)
  • Успешные ответы (200–299)
  • Перенаправления (300–399)
  • Ошибки клиента (400–499)
  • Ошибки сервера (500–599)
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientStatus
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var client = new HttpClient();

            var result = await client.GetAsync("http://zznob.ru");
            Console.WriteLine(result.StatusCode);
        }
    }
}
Получаем коды состояния ответа HTTP

В примере создается запрос GET для этого сайта. На выходе в консоли мы получаем код статуса запроса.

using var client = new HttpClient();
Создаем новый HttpClient
var result = await client.GetAsync("https://zznob.ru");

Метод GetAsync () отправляет запрос GET на указанный Uri в качестве асинхронной операции. Оператор await приостанавливает оценку включающего асинхронного метода до завершения асинхронной операции. Когда асинхронная операция завершается, оператор await возвращает результат операции, если таковой имеется.

Выполнив данный код мы получим сообщение ОК, которое соответствует коду 200 и означает что сайт работает.

GET запрос

Метод GET запрашивает представление указанного ресурса.

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientEx
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var client = new HttpClient();
            var content = await client.GetStringAsync("https://zznob.ru");

            Console.WriteLine(content);
        }
    }
}

В примере выдается запрос GET на веб-сайт zznob.ru. Он выводит простой HTML-код домашней страницы.

var content = await client.GetStringAsync(«https://zznob.ru»);

GetStringAsync () отправляет запрос GET указанному Uri и возвращает тело ответа в виде строки в асинхронной операции.

Выполнив код из примера мы получим в консоли вывод исходного кода страницы.

HEAD запрос

Метод HTTP HEAD запрашивает заголовки, которые возвращаются, если указанный ресурс будет запрошен методом HTTP GET.

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientHead
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var url = "https://zznob.ru";
            using var client = new HttpClient();

            var result = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));

            Console.WriteLine(result);
        }
    }
}

В примере выдается запрос HEAD. В консоль будет выведено примерно следующее:

HTTP/2 200 OK
server: nginx
date: Mon, 13 Apr 2020 06:43:59 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
strict-transport-security: max-age=15768000
content-encoding: gzip
X-Firefox-Spdy: h2

Это поля заголовка ответа.

POST запрос

Метод HTTP POST отправляет данные на сервер. Тип тела запроса указывается заголовком Content-Type.
Нам нужно добавить пакет Newtonsoft.Json для обработки данных JSON.

using System;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace HttpClientPost
{
    class Person
    {
        public string Name { get; set; }
        public string Occupation { get; set; }

        public override string ToString()
        {
            return $"{Name}: {Occupation}";
        }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var person = new Person();
            person.Name = "John Doe";
            person.Occupation = "gardener";

            var json = JsonConvert.SerializeObject(person);
            var data = new StringContent(json, Encoding.UTF8, "application/json");

            var url = "https://httpbin.org/post";
            using var client = new HttpClient();

            var response = await client.PostAsync(url, data);

            string result = response.Content.ReadAsStringAsync().Result;
            Console.WriteLine(result);
        }
    }
}

В этом примере мы отправляем запрос POST на веб-сайт https://httpbin.org/post, который представляет собой сервис онлайн-тестирования для разработчиков.

var person = new Person();
person.Name = "John Doe";
person.Occupation = "gardener";

var json = JsonConvert.SerializeObject(person);
var data = new StringContent(json, Encoding.UTF8, "application/json");

Мы превращаем объект в данные JSON с помощью пакета Newtonsoft.Json.

var response = await client.PostAsync(url, data);

Мы отправляем асинхронный запрос POST с помощью метода PostAsync ().

string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(result);

Читаем возвращенные данные и выводим их на консоль.

{
    "args": {},
    "data": "{\"Name\":\"John Doe\",\"Occupation\":\"gardener\"}",
    "files": {},
    "form": {},
    "headers": {
    "Content-Length": "43",
    "Content-Type": "application/json; charset=utf-8",
    "Host": "httpbin.org"
    },
    "json": {
    "Name": "John Doe",
    "Occupation": "gardener"
    },
    ...
    "url": "https://httpbin.org/post"
}

JSON-запрос

JSON (JavaScript Object Notation) — это легкий формат обмена данными. Этот формат легко читать и писать людям, а машинам анализировать и генерировать. Это менее многословная и более читаемая альтернатива XML. Официальный тип мультимедиа в Интернете для JSON — application / json.

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;

namespace HttpClientJson
{
    class Contributor
    {
        public string Login { get; set; }
        public short Contributions { get; set; }

        public override string ToString()
        {
            return $"{Login,20}: {Contributions} contributions";
        }
    }

    class Program
    {
        private static async Task Main()
        {
            using var client = new HttpClient();

            client.BaseAddress = new Uri("https://api.github.com");
            client.DefaultRequestHeaders.Add("User-Agent", "C# console program");
            client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

            var url = "repos/symfony/symfony/contributors";
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();
            var resp = await response.Content.ReadAsStringAsync();

            List<Contributor> contributors = JsonConvert.DeserializeObject<List<Contributor>>(resp);
            contributors.ForEach(Console.WriteLine);
        }
    }
}

В этом примере генерируется запрос GET для Github. Он узнает о главных участниках платформы Symfony. Он использует Newtonsoft.Json для работы с JSON.

client.DefaultRequestHeaders.Add("User-Agent", "C# console program");

В заголовке запроса мы указываем пользовательский агент.

client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));

В значении заголовка accept мы говорим, что JSON является приемлемым типом ответа.

var url = "repos/symfony/symfony/contributors";
HttpResponseMessage response = await client.GetAsync(url);
var resp = await response.Content.ReadAsStringAsync();

Мы генерируем запрос и читаем контент асинхронно.

List<Contributor> contributors = JsonConvert.DeserializeObject<List<Contributor>>(resp);
contributors.ForEach(Console.WriteLine);

Мы преобразуем ответ JSON в список объектов Contributor с помощью метода JsonConvert.DeserializeObject ().

Скачиваем изображение

GetByteArrayAsync () отправляет запрос GET указанному Uri и возвращает тело ответа в виде байтового массива в асинхронной операции.

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientDownloadImage
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var httpClient = new HttpClient();
            var url = "https://zznob.ru/wp-content/uploads/2020/04/scraping.jpeg";
            byte[] imageBytes = await httpClient.GetByteArrayAsync(url);

            string documentsPath = System.Environment.GetFolderPath(
                    System.Environment.SpecialFolder.Personal);

            string localFilename = "scraping.jpeg";
            string localPath = Path.Combine(documentsPath, localFilename);
            File.WriteAllBytes(localPath, imageBytes);
        }
    }
}

В этом примере мы загружаем изображение с веб-сайта zznob.ru. Изображение записывается в папку «Документы» пользователя.

byte[] imageBytes = await httpClient.GetByteArrayAsync(url);

GetByteArrayAsync () возвращает изображение в виде массива байтов.

string documentsPath = System.Environment.GetFolderPath(
    System.Environment.SpecialFolder.Personal);

Мы определяем папку Documents с помощью метода GetFolderPath ().

File.WriteAllBytes(localPath, imageBytes);

Байты записываются на диск с помощью метода File.WriteAllBytes ().

Базовая аутентификация

В протоколе HTTP базовая аутентификация доступа — это метод для агента пользователя HTTP (такого как веб-браузер или консольное приложение), чтобы предоставить имя пользователя и пароль при выполнении запроса. При базовой HTTP-аутентификации запрос содержит поле заголовка в форме Авторизация: Basic <credentials>, где credentials — это кодировка base64 идентификатора и пароля, соединенных одним двоеточием:.

Примечание: учетные данные не зашифрованы; следовательно, базовая аутентификация HTTP должна использоваться с протоколом HTTPS.

Базовая аутентификация HTTP — самый простой метод обеспечения контроля доступа к веб-ресурсам. Он не требует файлов cookie, идентификаторов сеансов или страниц входа; базовая аутентификация HTTP использует стандартные поля в заголовке HTTP.

using System;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace HttpClientAuth
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var userName = "user7";
            var passwd = "passwd";
            var url = "https://httpbin.org/basic-auth/user7/passwd";

            using var client = new HttpClient();

            var authToken = Encoding.ASCII.GetBytes($"{userName}:{passwd}");
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                    Convert.ToBase64String(authToken));

            var result = await client.GetAsync(url);

            var content = await result.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
    }
}

В этом примере учетные данные отправляются на веб-сайт httpbin.org.

var authToken = Encoding.ASCII.GetBytes($"{userName}:{passwd}");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(authToken));

Здесь мы строим заголовок аутентификации.

var url = "https://httpbin.org/basic-auth/user7/passwd";

URL содержит детали аутентификации, потому что мы тестируем их на веб-сайте httpbin.org. Таким образом, нам не нужно настраивать наш собственный сервер. Конечно, детали аутентификации никогда не помещаются в URL.

{
    "authenticated": true,
    "user": "user7"
}

В этом уроке мы использовали C# HttpClient для создания HTTP-запросов.