Класс HttpClient и отправка запросов

Последнее обновление: 13.06.2018

Для взаимодействия с веб-сервисами в .NET используется класс HttpClient из пространства имен System.Net.Http. С помощью его методов можно посылать определенный запрос к серверу.

Работа с HttpClient

HttpClient предоставляет следующие методы:

  • GetAsync(): отправляет запрос типа Get

  • DeleteAsync(): отправляет запрос типа Delete

  • PostAsync(): отправляет запрос типа Post

  • PutAsync(): отправляет запрос типа Put

  • SendAsync(): отправляет запрос любого типа в зависимости от настроек заголовков запроса. Выше определенные методы являются частными случаями данного метода

  • GetByteArrayAsync(): отправляет массив байтов в запросе типа Get

  • GetStreamAsync(): отправляет поток Stream в запросе типа Get

  • GetStringAsync(): отправляет строку в запросе типа Get

При отправке запроса для его настройки мы можем применять объект класса HttpRequestMessage. В частности, для конфигурации запроса можно использовать следующие свойства класса:

  • Content: отправляемые данные

  • Headers: заголовки http

  • Method: метод отправки(Get/Post/Put/Delete)

  • RequestUri: адрес сервера

Например:

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage();
request.RequestUri = new Uri("http://somesite.com");
request.Method = HttpMethod.Get;
request.Headers.Add("Accept", "application/json");
await client.SendAsync(request);

После выполнения запроса мы можем получить ответ в виде объекта класса HttpResponseMessage. Для обработки ответа мы можем воспользоваться следующими свойствами данного класса:

  • Content: полученные данные

  • Headers: заголовки ответа, полученные от сервера

  • StatusCode: статусный код ответа

Например:

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage();
request.RequestUri = new Uri("http://somesite.com");
request.Method = HttpMethod.Get;
request.Headers.Add("Accept", "application/json");

HttpResponseMessage response = await client.SendAsync(request);
if(response.StatusCode==HttpStatusCode.OK)
{
    HttpContent responseContent = response.Content;
    var json = await responseContent.ReadAsStringAsync();
}

Если сервер отправляет нам данные в виде json, то, получив данные в виде строки с помощью метода responseContent.ReadAsStringAsync(), мы можем их десериализовать из json с помощью специальных инструментов или библиотек, как Json.NET.

Используя методы GetAsync()/PostAsync()/PutAsync()/DeleteAsync() соответственно уже не надо указывать метод запроса. Например:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://somesite.com");
if(response.StatusCode==HttpStatusCode.OK)
{
    HttpContent responseContent = response.Content;
    var json = await responseContent.ReadAsStringAsync();
}

Если сервер посылает ответ в виде простой строки, массива байт или файла, то в данном случае проще использовать методы GetStringAsync()/GetByteArrayAsync()/GetStreamAsync(). Например, получим от сервера строку:

HttpClient client = new HttpClient();
string response = await client.GetStringAsync("http://somesite.com");

В то же время в данном случае мы не сможем отследить статусный код ответа от сервера.

Отправка и получение данных

Данные запроса и ответа представлены в виде объекта класса HttpContent. Этот класс является абстрактным, и фактически мы будем работать с его производными классами:

  • StringContent: применяется, если отправка или получение данных происходит в виде строки

  • ByteArrayContent: применяется, если отправка или получение данных происходит в виде массива байтов

  • StreamContent: применяется, если отправка или получение данных происходит, как правило, в виде файла, например, изображения

Если мы хотим получить данные в виде строки, массива байт или файла, то соответственно мы можем использовать один из методов GetStringAsync()/GetByteArrayAsync()/GetStreamAsync(), либо можно обрабатывать свойство Content объекта HttpResponseMessage.

Для отправки данных мы можем задействовать свойство Content объекта HttpRequestMessage:

var friend = new Friend { Id = 1, Name = "Иван Иванов" };
// сериализация объекта с помощью Json.NET
string json = JsonConvert.SerializeObject(friend);
HttpContent content = new StringContent(json);

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage();
request.RequestUri = new Uri("http://somesite.com");
request.Method = HttpMethod.Post;
request.Content = content;
HttpResponseMessage response = await client.SendAsync(request);

Либо в качестве альтернативы для отправки данных можно использовать специальные методы PostAsync()/PutAsync():

var friend = new Friend { Id = 1, Name = "Иван Иванов" };
// сериализация объекта с помощью Json.NET
string json = JsonConvert.SerializeObject(friend);
HttpContent content = new StringContent(json);

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync("http://somesite.com", content);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850