Ошибка на 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, чтобы сервер мог ответить соответствующим образом.

Другие вопросы по тегам