Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用Google Translate API v2时出现帖子错误#_C#_Json_Post_Httpwebrequest_Google Translate - Fatal编程技术网

C# 从C调用Google Translate API v2时出现帖子错误#

C# 从C调用Google Translate API v2时出现帖子错误#,c#,json,post,httpwebrequest,google-translate,C#,Json,Post,Httpwebrequest,Google Translate,背景: 我被要求创建一个翻译web服务,它基本上必须与Google翻译API交互。由于我确实需要翻译的文本大于2000个字符,因此我无法使用GET-WebRequest/GET方法。相反,我应该使用支持5000个字符的帖子 技术说明: VS 2010 uClimate,谷歌翻译API v2() 问题: 我为POST web请求实现了以下代码,它适用于最多1489个字符的URL。如果URL包含1490,则会引发异常:“远程服务器返回错误:(414)请求URI太大。” 使用系统; 使用System.

背景:

我被要求创建一个翻译web服务,它基本上必须与Google翻译API交互。由于我确实需要翻译的文本大于2000个字符,因此我无法使用GET-WebRequest/GET方法。相反,我应该使用支持5000个字符的帖子

技术说明:

VS 2010 uClimate,谷歌翻译API v2()

问题:

我为POST web请求实现了以下代码,它适用于最多1489个字符的URL。如果URL包含1490,则会引发异常:“远程服务器返回错误:(414)请求URI太大。”

使用系统;
使用System.Collections.Generic;
使用System.IO;
Net系统;
使用System.Runtime.Serialization;
使用System.Runtime.Serialization.Json;
使用系统文本;
使用Newtonsoft.Json.Linq;
字符串sourceLanguage=“es”;//英语
字符串targetLanguage=“en”//西班牙的
string text=“在家工作(请将此字符串替换为长度超过1490个字符的文本!!!”;//待翻译文本
//web请求的url
字符串apiUrl=”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);
字节[]字节=Encoding.ASCII.GetBytes(url);
Stream outputStream=null;
string translatedText=string.Empty;
//网络请求
WebRequest WebRequest=WebRequest.Create(url);
//POST方法
webRequest.Method=“POST”;
webRequest.Headers.Add(“X-HTTP-Method-Override:GET”);
webRequest.ContentType=“application/x-www-form-urlencoded”;
尝试
{
//发信
webRequest.ContentLength=字节.Length;
outputStream=webRequest.GetRequestStream();
outputStream.Write(字节,0,字节.长度);
}
捕获(WebE例外)
{
WriteLine(例如,消息“HttpPost:Request error”);
}
尝试
{
//得到回应
WebResponse WebResponse=webRequest.GetResponse();
if(webResponse!=null)
{
//读取响应流
使用(StreamReader sr=newstreamreader(webResponse.GetResponseStream(),Encoding.UTF8))
{
JObject obj=JObject.Parse(sr.ReadToEnd());
JToken translated=obj.SelectToken(“data.translations[0].translatedText”);
//将翻译后的文本转换为字符串
translatedText=translated.Value();
}
}
}
捕获(WebE例外)
{
Console.WriteLine(例如,消息“HttpPost:Response error”);
}
问题:

有没有人有使用这个翻译API的经验,看看这里的错误是什么?谁能告诉我哪一个是我花了3个小时寻找的f“$@!错误!!我快疯了。任何贡献都将不胜感激。提前感谢!)

重要注意事项
我通过以下帖子解决了POST问题:

因为您正在覆盖GET,所以应该能够将参数放在请求正文中,而不是放在查询字符串上。如果您传入大量文本,您收到的错误是完全有效的。我认为RFC没有指定最大限制,但pr没有提供414错误代码,以便服务器能够正确响应。

您能更清楚一点吗?我还没有找到正确的方法来成功覆盖GET方法。我仍然面临URI长度为1800个字符的“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");
        }