@dlysenko1311

Post запрос к апи, как написать используя httpclient?

У меня есть такой запрос питоне:

import requests

URL='https://test/test/test/sync?test&operation=test'
body = {"sinceDateTimeUtc":"2020-01-01 00:00:00.000", "tillDateTimeUtc": "2023-01-11 00:00:00.000"}
headers = {'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': '1sav23456vdsa7vsa8'}

response  = requests.post(URL, json=body, headers=headers)

my_json = response.text
print(my_json)


На С# я смог написать такой запрос:
string url = "https://test/test/test/sync?test&operation=test";
var request = (HttpWebRequest)WebRequest.Create(url);
var postData = "{ \"sinceDateTimeUtc\":\"2020-01-01 00:00:00.000\", \"tillDateTimeUtc\": \"2022 -12-11 00:00:00.000\"}";
var data = Encoding.UTF8.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Accept = "application/json";
request.Headers.Add("Authorization", "1sav23456vdsa7vsa8");
using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}
var response = request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(responseString);


Но я знаю, что на C# такой же post запрос можно написать используя httpclient.
Как написать такой запрос используя httpclient? И/ИЛИ как можно модернизировать мой код на С#, чтобы передавать тело запроса, каким-нибудь другим способом (без вот этого элемента:

using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}

)
  • Вопрос задан
  • 502 просмотра
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;

var request = new // По хорошему надо вынести в отдельный класс или record
{
    sinceDateTimeUtc = new DateTime(2020, 01, 01, 0, 0, 0),
    tillDateTimeUtc = new DateTime(2022, 12, 11, 0, 0, 0),
};

var httpRequest = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://test/test/test/sync?test&operation=test"),
    Headers = {
        Authorization = AuthenticationHeaderValue.Parse("1sav23456vdsa7vsa8"),
        Accept = {MediaTypeWithQualityHeaderValue.Parse("application/json")}
    },
    Content = new StringContent(JsonSerializer.Serialize(request))
    {

        Headers = {
          ContentType = MediaTypeHeaderValue.Parse("application/json"),
        },
    },
};

// По возможности httpClient нужно переиспользовать. Инициализируй 1 раз, сделай побольше запросов, а в конце Dispose()
using var httpClient = new HttpClient(); 

var response = await httpClient.SendAsync(httpRequest);
// Дальше работаем с response так, как нам нужно
var contentString = await response.Content.ReadAsStringAsync();
Console.WriteLine(contentString);


Если нужно спарсить ответ как json, то используй JsonSerializer.Deserialize нас пришедшем стриме.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы