Для взаимодействия с веб-сервисами в .NET используется класс HttpClient из пространства имен System.Net.Http. С помощью его методов можно посылать определенный запрос к серверу.
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);