C# HttpClient возвращает пустую строку при POST запросе
Имеется метод для получения данных от API с помощью HttpClient. Вроде все просто, но в результате выполнения Content пустой. Статус ответа при этом 200.
При выполнении этого же запроса через сервис проверки API все прекрасно работает - т.е. API работает. Авторизации API не требует.
RequestContent представляет собой объект содержащий данные запроса, сериализуется в "{"action":"get","items":{"href":"/windows/releases/","what":1}}".
Код метода:
private static async Task<string> GetReleasesList(CancellationToken cancellationToken = default)
{
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
AllowAutoRedirect = false,
UseCookies = true
};
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("Accept", "application/json");
var requestContent = new RequestContent("get", "/windows/releases/", 1);
var response = await client.PostAsJsonAsync("https://mkvtoolnix.download/windows/releases/", requestContent, cancellationToken);
response.EnsureSuccessStatusCode();
var text = await response.Content.ReadAsStringAsync(cancellationToken);
return text;
}
Класс RequestContent
public class RequestContent
{
[JsonPropertyName("action")]
public string Action { get; set; }
[JsonPropertyName("items")]
public Item Items { get; set; }
public RequestContent(string action, string href, int what)
{
Items = new Item(href, what);
Action = action;
}
public class Item
{
[JsonPropertyName("href")]
public string Href { get; set; }
[JsonPropertyName("what")]
public int What { get; set; }
public Item(string href, int what)
{
Href = href;
What = what;
}
}
}```
Ответы (1 шт):
Видимо это просто примитивная защита от ботов или баг сервера. Достаточно добавить User-Agent.
private static readonly HttpClient client = new() { DefaultRequestVersion = HttpVersion.Version20 };
static async Task Main(string[] args)
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0");
var obj = new { action = "get", items = new { href = "/windows/releases/", what = 1 } };
using var response = await client.PostAsJsonAsync("https://mkvtoolnix.download/windows/releases/", obj);
string text = await response.Content.ReadAsStringAsync();
Console.WriteLine(Regex.Unescape(text));
}
Вывод в консоль
{"items":[{"href":"/","time":1639909711000,"size":null,"managed":true,"fetched":true},{"href":"/almalinux/","time":1622654036000,"size":null,"managed":true,"fetched":false},{"href":"/appimage/","time":1636884099000,"size":null,"managed":true,"fetched":false},{"href":"/centos/","time":1622653796000,"size":null,"managed":true,"fetched":false},{"href":"/centosstream/","time":1622890796000,"size":null,"managed":true,"fetched":false},...
HttpVersion.Version20 здесь роли не играет, я просто пока отлаживал, видел что сервер поддерживает, и просто добавил в код.