Не получается отправить 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 шт):
Если перевести коды символов utf-8 в строку, то сервер отвечает: "Не указан email". Попробуйте через Fiddler посмотреть что в реальности отправляется на сервер. Может он хочет email в другом поле, тут сложно сходу разобраться.
- Не надо создавать
HttpClientна каждый запрос. IDisposableклассы надо оборачивать вusingили диспозить вручную.FormUrlEncodedContentавтоматически настроит Content-Type, не нужно это делать вручную.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://, и все заработало.