Ошибка на POST при вызове Google Translate API v2 из C#
Фон:
Меня попросили создать веб-службу перевода, которая в основном должна взаимодействовать с API Google Translate. Поскольку текст, который мне нужно перевести, превышает 2000 символов, я не могу использовать метод GET WebRequest/GET. Вместо этого я должен использовать POST, который поддерживает до 5000 символов.
Технические заметки:
VS 2010 Utlimate, Google Translate API v2 ( http://code.google.com/apis/language/translate/v2/using_rest.html#WorkingResults)
Выпуск:
Я реализовал приведенный ниже код для веб-запроса POST, и он работает для URL-адресов, содержащих не более 1489 символов. Если URL содержит 1,490, возникает исключение: "Удаленный сервер возвратил ошибку: (414) Request-URI Too Large".
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using Newtonsoft.Json.Linq;
string sourceLanguage = "es"; // English
string targetLanguage = "en"; // Spanish
string text = "Working from home ( please replace this string for a text longer thant 1,490 characters!!! )"; // Text to be translated
// url for a web request
String apiUrl = "https://www.googleapis.com/language/translate/v2?key={0}&source={1}&target={2}&q={3}";
String url = String.Format(apiUrl, Constants.apiKey, sourceLanguage, targetLanguage, text);
byte[] bytes = Encoding.ASCII.GetBytes(url);
Stream outputStream = null;
string translatedText = string.Empty;
// web request
WebRequest webRequest = WebRequest.Create(url);
// POST method
webRequest.Method = "POST";
webRequest.Headers.Add("X-HTTP-Method-Override:GET");
webRequest.ContentType = "application/x-www-form-urlencoded";
try
{
// send the POST
webRequest.ContentLength = bytes.Length;
outputStream = webRequest.GetRequestStream();
outputStream.Write(bytes, 0, bytes.Length);
}
catch (WebException e)
{
Console.WriteLine(e.Message, "HttpPost: Request error");
}
try
{
// get the response
WebResponse webResponse = webRequest.GetResponse();
if (webResponse != null)
{
// read response stream
using (StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
JObject obj = JObject.Parse(sr.ReadToEnd());
JToken translated = obj.SelectToken("data.translations[0].translatedText");
// get translated text into a string
translatedText = translated.Value<string>();
}
}
}
catch (WebException e)
{
Console.WriteLine(e.Message, "HttpPost: Response error");
}
Вопрос:
Кто-нибудь имеет опыт использования этого API перевода и посмотреть, в чем здесь ошибка? Может кто-нибудь сказать мне, что это ошибка f"$@!, Которую я потратил последние 3 часа в поисках!! Я схожу с ума от этого. Любой вклад будет ДЕЙСТВИТЕЛЬНО оценен. Заранее спасибо!:)
Важное примечание: я смог преодолеть проблему POST, следуя этому сообщению: Google Translate V2 не может обрабатывать большие текстовые переводы из C#
1 ответ
Поскольку вы переопределяете GET, вы должны иметь возможность поместить параметры в тело запроса, а не в строку запроса. Ошибка, которую вы получаете, совершенно допустима, если вы передаете большой объем текста. Я не думаю, что RFC определяет максимальный лимит, но предоставляет код ошибки 414, чтобы сервер мог ответить соответствующим образом.