Ошибка на POST при вызове Google Translate API v2 из C # - PullRequest
2 голосов
/ 16 февраля 2012

Фон :

Меня попросили создать веб-службу перевода, которая в основном должна взаимодействовать с API Переводчика Google.Поскольку текст, который мне нужно перевести, превышает 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-адрес содержит 1490 символов, возникает исключение.: " Удаленный сервер возвратил ошибку: (414) Request-URI слишком велик. "

 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 часа !! Я схожу с ума от этого. Любой вклад будет ДЕЙСТВИТЕЛЬНОпризнателен. Заранее спасибо! :) 1027

Важное примечание : мне удалось преодолеть проблему POST, выполнив следующее сообщение: Переводчик Google V2 не может обрабатывать переводы больших текстов из C #

1 Ответ

0 голосов
/ 16 февраля 2012

Поскольку вы переопределяете GET, вы должны иметь возможность поместить параметры в тело запроса, а не в строку запроса.Ошибка, которую вы получаете, совершенно допустима, если вы передаете большой объем текста.Я не думаю, что RFC определяет максимальный лимит, но предоставляет код ошибки 414, чтобы сервер мог ответить соответствующим образом.

...