Google Translate V2 无法处理来自 C# 的大文本翻译 [英] Google Translate V2 cannot hanlde large text translations from C#
问题描述
我已经使用 Google Translation V2 api 和 GET 方法实现了 C# 代码.它成功地翻译了小文本,但是当增加文本长度并且需要 1,800 个字符(包括 URI 参数)时,我收到URI 太大"错误.
I've implemented C# code using the Google Translation V2 api with the GET Method. It successfully translates small texts but when increasing the text length and it takes 1,800 characters long ( including URI parameters ) I'm getting the "URI too large" error.
好的,我烧掉了所有路径,并在 Internet 上发布的多个页面上调查了该问题.他们都明确表示应该覆盖 GET 方法以模拟 POST 方法(旨在提供对 5,000 个字符 URI 的支持),但没有办法找到它的代码示例.
Ok, I burned down all the paths and investigated the issue across multiple pages posted on Internet. All of them clearly says the GET method should be overriden to simulate a POST method ( which is meant to provide support to 5,000 character URIs ) but there is no way to find out a code example to of it.
有没有人有任何例子或可以提供一些信息?
Does anyone has any example or can provide some information?
[EDIT] 这是我使用的代码:
[EDIT] Here is the code I'm using:
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;
}
推荐答案
显然使用 WebClient
不起作用,因为您无法根据需要更改标题,根据文档:
Apparently using WebClient
won't work as you cannot alter the headers as needed, per the documentation:
注意:如果您想在单个请求中发送更多数据,您也可以使用 POST 来调用 API.POST 正文中的 q
参数必须小于 5K 个字符.要使用 POST,您必须使用 X-HTTP-Method-Override
标头告诉 Translate API 将请求视为 GET(使用 X-HTTP-Method-Override: GET
).
Note: You can also use POST to invoke the API if you want to send more data in a single request. The
q
parameter in the POST body must be less than 5K characters. To use POST, you must use theX-HTTP-Method-Override
header to tell the Translate API to treat the request as a GET (useX-HTTP-Method-Override: GET
).
您可以使用 WebRequest
,但您需要添加 X-HTTP-Method-Override
标头:
You can use WebRequest
, but you'll need to add the X-HTTP-Method-Override
header:
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);
}
这篇关于Google Translate V2 无法处理来自 C# 的大文本翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!