Передаю не правильный заголовок в POST запрос
В нем такой пример POST запроса на RestSharp (валидный ключ вложен):
var client = new RestClient("https://kiara-translate.p.rapidapi.com/get_translated/");
var request = new RestRequest(Method.POST);
request.AddHeader("x-rapidapi-host", "kiara-translate.p.rapidapi.com");
request.AddHeader("x-rapidapi-key", "tb0d24d7fffmsh9be6b811c6b83dcp131c79jsn83b8a400788b");
request.AddHeader("content-type", "application/json");
request.AddHeader("accept", "application/json");
request.AddParameter("application/json", "{ "input": "We make the world a better place", "lang": "ja"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
У меня проблемы с строкой, а именно с ее форматом:
request.AddParameter("application/json", "{ "input": "We make the world a better place", "lang": "ja"}", ParameterType.RequestBody);
Тут должен передаваться параметр перевода и строка текста на перевод.
Вот что получается (путем обычного HttpWebRequest):
https://dotnetfiddle.net/iEowhw
Specified value has invalid HTTP Header characters
Если не экранировать
"
получается ошибка синтаксиса
Как правильно уложить запрос?
Ответы (1 шт):
Ох и ужасная эта API, пришлось неслабо помучаться.
Дело в том, что стандартный строковый запрос с генерирует вот такой заголовок
Content-Type: application/json; charset=utf-8
Это вообще настолько стандарт, насколько это возможно, но!
Сервер возвращает:
500 Internal Server Error
Еще приключений добавили примеры запросов на сайте, которые у них вообще все с ошибками, даже для JavaScript. Но с помощью примеров на JS мне удалось покидать запросы и все-таки добиться от сервера ответа.
А работать оно начало только тогда, когда я явным образом переопределил Content-Type вот на такой.
Content-Type: application/json
Ребята эти редкие извращенцы, но мы и не таких видали.
Вот код для консольного приложение .NET Core 3.1, C# 8.0
Классы данных запроса и ответа
public class TestJsonRequest
{
[JsonPropertyName("input")]
public string Input { get; set; }
[JsonPropertyName("lang")]
public string Lang { get; set; }
}
public class TestJsonResponse
{
[JsonPropertyName("response")]
public string ResponseStatus { get; set; }
[JsonPropertyName("source_lang")]
public string SourceLang { get; set; }
[JsonPropertyName("status")]
public int Status { get; set; }
[JsonPropertyName("target_lang")]
public string TargetLang { get; set; }
[JsonPropertyName("text")]
public string Text { get; set; }
[JsonPropertyName("translated")]
public string Translated { get; set; }
}
Сам код
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
TestJsonRequest requestData = new TestJsonRequest
{
Input = "We make the world a better place",
Lang = "ru"
};
string json = JsonSerializer.Serialize(requestData);
Console.WriteLine(json);
try
{
string jsonResponse = await PostJsonAsync("https://kiara-translate.p.rapidapi.com/get_translated/", json);
Console.WriteLine(jsonResponse);
TestJsonResponse response = JsonSerializer.Deserialize<TestJsonResponse>(jsonResponse);
Console.WriteLine("ResponseStatus: {0}", response.ResponseStatus);
Console.WriteLine("SourceLang: {0}", response.SourceLang);
Console.WriteLine("Status: {0}", response.Status);
Console.WriteLine("TargetLang: {0}", response.TargetLang);
Console.WriteLine("Text: {0}", response.Text);
Console.WriteLine("Translated: {0}", response.Translated);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
private static async Task<string> PostJsonAsync(string url, string json)
{
using HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
request.Content = content;
request.Headers.Add("x-rapidapi-host", "kiara-translate.p.rapidapi.com");
request.Headers.Add("x-rapidapi-key", "b0d24d7fffmsh9be6b811c6b83dcp131c79jsn83b8a400788b");
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // костыль
using HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
//response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
Вывод в консоль
{"input":"We make the world a better place","lang":"ru"}
{"text": "We make the world a better place", "translated": "\u041c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043c\u0438\u0440 \u043b\u0443\u0447\u0448\u0435", "target_lang": "ru", "source_lang": "en", "response": "Successful", "status": 200}
ResponseStatus: Successful
SourceLang: en
Status: 200
TargetLang: ru
Text: We make the world a better place
Translated: Мы делаем мир лучше