Не получается отправить POST запрос в виде массива на API сервер

Второй день не могу совладать с API сайта https://smmok-fb.ru/. Дело в том, чтобы получить API ключ мне нужно отправить массив с учетными данными(mail, password) в ответе в виде строки JSON я должен получить ключ. Но в итоге никак не получается отправить запрос должным образом, прошу помочь с отправкой POST запроса.

URL API - http://smmok-fb.ru/api/getApiKey Документация к API - https://smmok14.ru/api_docs

Класс для десерилизация JSON:

public class RequestSMMOK
{

    [JsonProperty("status")]
    public int Status { get; set; }
    [JsonProperty("error")]
    public string Error { get; set; }

    [JsonProperty("respond")]
    public Respond[] Respond { get; set; }

}
public class Respond
{
    [JsonProperty("api_key")]
    public string ApiKey { get; set; }

}

Мой пример кода:

        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            HttpContent content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("email", "[email protected]"),

                new KeyValuePair<string, string>("password","value")
            });
            content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
            var responseMessage =
                await client.PostAsync("http://smmok-fb.ru/api/getApiKey", content);

            var result = JsonConvert.DeserializeObject<RequestSMMOK>(responseMessage.Content.ReadAsStringAsync().Result);
            return result;
        }

Что я получаю в итоге в ответе - {"status":400,"error":"\u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d email"}"


Ответы (2 шт):

Автор решения: CrazyElf

Если перевести коды символов utf-8 в строку, то сервер отвечает: "Не указан email". Попробуйте через Fiddler посмотреть что в реальности отправляется на сервер. Может он хочет email в другом поле, тут сложно сходу разобраться.

→ Ссылка
Автор решения: aepot
  1. Не надо создавать HttpClient на каждый запрос.
  2. IDisposable классы надо оборачивать в using или диспозить вручную.
  3. FormUrlEncodedContent автоматически настроит Content-Type, не нужно это делать вручную
  4. .Result в асинхронном коде - это ошибка, используйте await

Разберу на примере.

Объявите HttpClient отдельно, один раз на все время работы программы.

private static readonly HttpClient client = new HttpClient();

Eсли вам нужен User-Agent, добавьте его тоже в конструкторе класса, один раз. Но я не уверен, что он вообще вам нужен, попробуйте сначала без него.

client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

Ну и сам метод.

private async Task<T> PostAPIData<T>(string url, Dictionary<string, string> data)
{
    using (HttpContent content = new FormUrlEncodedContent(data))
    using (HttpResponseMessage responseMessage = await client.PostAsync(url, content).ConfigureAwait(false))
    {
        string jsonText = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
        return JsonConvert.DeserializeObject<T>(jsonText);
    }
}

Вызов

Dictionary<string, string> postData = new Dictionary<string, string>();
postData.Add("email", "[email protected]");
postData.Add("password","value");
RequestSMMOK result = await PostAPIData<RequestSMMOK>("https://smmok-fb.ru/api/getApiKey", postData);

Вот здесь еще ошибка, не нужен массив, исправьте вот так

[JsonProperty("respond")]
public Respond Respond { get; set; }

Допишу сюда:

Причина ошибки была в том, что сервер хочет HTTPS запрос, а не HTTP, хотя в документации к API это не указано. Изменили ссылку на https://, и все заработало.

→ Ссылка