C# Google Translate V2无法从C语言中翻译大文本#

C# Google Translate V2无法从C语言中翻译大文本#,c#,json,post,google-translate,C#,Json,Post,Google Translate,我已经使用Google Translation V2 api和GET方法实现了C#代码。 它成功地翻译了小文本,但是当增加文本长度并且需要1800个字符长(包括URI参数)时,我得到了“URI太大”错误 好的,我烧毁了所有的路径,并在互联网上发布的多个页面上调查了这个问题。他们都明确表示应该重写GET方法来模拟POST方法(这意味着要支持5000个字符的uri),但是没有办法找到一个代码示例来解释它 是否有人有任何例子或可以提供一些信息 [编辑]以下是我正在使用的代码: String apiUr

我已经使用Google Translation V2 api和GET方法实现了C#代码。 它成功地翻译了小文本,但是当增加文本长度并且需要1800个字符长(包括URI参数)时,我得到了“URI太大”错误

好的,我烧毁了所有的路径,并在互联网上发布的多个页面上调查了这个问题。他们都明确表示应该重写GET方法来模拟POST方法(这意味着要支持5000个字符的uri),但是没有办法找到一个代码示例来解释它

是否有人有任何例子或可以提供一些信息

[编辑]以下是我正在使用的代码:

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);
            Stream outputStream = null;

        byte[] bytes = Encoding.ASCII.GetBytes(url);

        // create the http web request
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.KeepAlive = true;
        webRequest.Method = "POST";
        // Overrride the GET method as documented on Google's docu.
        webRequest.Headers.Add("X-HTTP-Method-Override: GET");
        webRequest.ContentType = "application/x-www-form-urlencoded";

        // send POST
        try
        {
            webRequest.ContentLength = bytes.Length;
            outputStream = webRequest.GetRequestStream();
            outputStream.Write(bytes, 0, bytes.Length);
            outputStream.Close();
        }
        catch (HttpException e)
        {
            /*...*/
        }

        try
        {
            // get the response
            HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
            if (webResponse.StatusCode == HttpStatusCode.OK && webRequest != null)
            {
                // read response stream 
                using (StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    string lista = sr.ReadToEnd();

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TranslationRootObject));
                    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(lista));
                    TranslationRootObject tRootObject = (TranslationRootObject)serializer.ReadObject(stream);
                    string previousTranslation = string.Empty;

                    //deserialize
                    for (int i = 0; i < tRootObject.Data.Detections.Count; i++)
                    {
                        string translatedText = tRootObject.Data.Detections[i].TranslatedText.ToString();
                        if (i == 0)
                        {
                            text = translatedText;
                        }
                        else
                        {
                            if (!text.Contains(translatedText))
                            {
                                text = text + " " + translatedText;
                            }
                        }
                    }
                    return text;
                }
            }
        }
        catch (HttpException e)
        {
            /*...*/
        }

        return text;
    }
String apirl=”https://www.googleapis.com/language/translate/v2?key={0}&source={1}&target={2}&q={3}”;
String url=String.Format(apirl、Constants.apiKey、sourceLanguage、targetLanguage、text);
Stream outputStream=null;
字节[]字节=Encoding.ASCII.GetBytes(url);
//创建http web请求
HttpWebRequest webRequest=(HttpWebRequest)webRequest.Create(url);
webRequest.KeepAlive=true;
webRequest.Method=“POST”;
//超越了Google文档中记录的GET方法。
webRequest.Headers.Add(“X-HTTP-Method-Override:GET”);
webRequest.ContentType=“application/x-www-form-urlencoded”;
//邮寄
尝试
{
webRequest.ContentLength=字节.Length;
outputStream=webRequest.GetRequestStream();
outputStream.Write(字节,0,字节.长度);
outputStream.Close();
}
catch(httpe异常)
{
/*...*/
}
尝试
{
//得到回应
HttpWebResponse webResponse=(HttpWebResponse)webRequest.GetResponse();
if(webResponse.StatusCode==HttpStatusCode.OK&&webRequest!=null)
{
//读取响应流
使用(StreamReader sr=newstreamreader(webResponse.GetResponseStream(),Encoding.UTF8))
{
string lista=sr.ReadToEnd();
DataContractJsonSerializer serializer=新的DataContractJsonSerializer(typeof(TranslationRootObject));
MemoryStream stream=新的MemoryStream(Encoding.UTF8.GetBytes(lista));
TranslationRootObject tRootObject=(TranslationRootObject)序列化程序.ReadObject(流);
string previousTranslation=string.Empty;
//反序列化
对于(int i=0;i
?什么?使用C#发布是很简单的,文档中就有

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
{
    // Set type to POST
    request.Method = "POST";
从那时起,您基本上可以将数据放入fom字段,并放入内容流中

这不是“模拟会后会议”,而是完全按照规范进行会后请求


顺便问一下,json在哪里输入?你说“用C#”。没有必要使用json?

显然,使用
WebClient
将无法工作,因为您无法根据需要更改标题:

注意:如果希望在单个请求中发送更多数据,还可以使用POST调用API。帖子正文中的
q
参数必须少于5K个字符。要使用POST,您必须使用
X-HTTP-Method-Override
头通知Translate API将请求视为GET(使用
X-HTTP-Method-Override:GET

您可以使用
WebRequest
,但需要添加
X-HTTP-Method-Override
标题:

var request = WebRequest.Create (uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("X-HTTP-Method-Override", "GET");

var body = new StringBuilder();
body.Append("key=SECRET");
body.AppendFormat("&source={0}", HttpUtility.UrlEncode(source));
body.AppendFormat("&target={0}", HttpUtility.UrlEncode(target));
 //--
body.AppendFormat("&q={0}", HttpUtility.UrlEncode(text));

var bytes = Encoding.ASCII.GetBytes(body.ToString());
if (bytes.Length > 5120) throw new ArgumentOutOfRangeException("text");

request.ContentLength = bytes.Length;
using (var output = request.GetRequestStream())
{
    output.Write(bytes, 0, bytes.Length);
}

公认的答案似乎过时了。现在,您可以使用WebClient(.net 4.5)成功地
POST
到google translate API,确保设置
X-HTTP-Method-Override
标题

这里有一些代码向您展示如何使用

using (var webClient = new WebClient())
{
    webClient.Headers.Add("X-HTTP-Method-Override", "GET");
    var data = new NameValueCollection() 
    { 
        { "key", GoogleTranslateApiKey }, 
        { "source", "en" }, 
        { "target", "fr"}, 
        { "q", "<p>Hello World</p>" } 
    };
    try
    {
        var responseBytes = webClient.UploadValues(GoogleTranslateApiUrl, "POST", data);
        var json = Encoding.UTF8.GetString(responseBytes);
        var result = JsonConvert.DeserializeObject<dynamic>(json);
        var translation = result.data.translations[0].translatedText;
    }
    catch (Exception ex)
    {
        loggingService.Error(ex.Message);
    }
} 
使用(var webClient=new webClient())
{
添加(“X-HTTP-Method-Override”、“GET”);
变量数据=新的NameValueCollection()
{ 
{“键”,谷歌翻译百科},
{“来源”,“en”},
{“目标”,“fr”},
{“q”,“你好,世界

”} }; 尝试 { var responseBytes=webClient.UploadValues(谷歌翻译IURL,“POST”,数据); var json=Encoding.UTF8.GetString(responseBytes); var result=JsonConvert.DeserializeObject(json); var translation=result.data.translations[0].translatedText; } 捕获(例外情况除外) { loggingService.Error(例如消息); } }
您能告诉我们您现在使用的代码吗?如果您使用的是
WebClient
vs
WebRequest
,策略会有所不同。感谢您的快速响应。我已经添加了我正在执行的代码。我还深入研究了你发布的代码,并且我能够更新我的代码,以便像你指出的那样发布。但是,在执行“request.GetResponse();”时,会引发以下错误:“远程服务器返回错误:(400)错误请求”。我会调查的。@George_21:你需要去掉URL中的参数,并将它们全部放在帖子正文中。你是我的英雄!:P我终于