c# : пример выполнения GET запроса
День добрый, никак не могу разобраться с корректным выполнением GET запроса. Имеется API, из которого я без проблем получаю данные с помощью curl :
curl -H "X-Auth-Token: LocalTocken" -H "X-User-Id: LocalID" https://api.local/tables?tableName=myTable
Запрос возвращает корректные данные. Пытаюсь выполнить простейший запрос на C#:
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.local/tables?tableName=myTable"))
{
request.Headers.TryAddWithoutValidation("X-Auth-Token", "LocalTocken");
request.Headers.TryAddWithoutValidation("X-User-Id", "LocalID");
var response = await httpClient.SendAsync(request).Result;
Console.WriteLine(response);
}
}
В результате получаю абракадабру :
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
x-xss-protection: 1
x-instance-id: 2sdf5dsdfesdf6fp2DS
pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
Cache-Control: no-store
Date: Wed, 06 May 2020 09:45:58 GMT
Server: nginx/1.17.9
Content-Language: ru
Content-Type: application/json
}
Где можно увидеть простейший пример синхронного GET и POST запроса?
Ответы (1 шт):
Здесь ошибка:
var response = await httpClient.SendAsync(request).Result;
Именно поэтому я не люблю ключевое слово var, сильно мешает ловить подобное.
Ответ прочитать можно вот так.
HttpResponseMessage response = await httpClient.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Еще у вас скорее всего опечатка "LocalTocken", наверное должно быть "LocalToken".
Дополнительно
Не создавайте HttpClient для каждого запроса, его экземпляры просто забьют вам все сокеты и вы просто потеряете связь. Об этом написано в примере кода в документации.
// HttpClient is intended to be instantiated once per application, rather than per-use.
Создайте один глобальный HttpClient и используйте его где нужно. Диспозить его не требуется, несмотря на то что он IDisposable, но если хочется, то можно вызвать Dispose() при завершении работы приложения, он по сути только отменяет активные HTTP запросы, выполняет CancelPendingRequests().
private HttpClient httpClient = new HttpClient();