Google Translate V2无法处理来自C#的大型文本翻译

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

好吧,我烧掉了所有的路径,并在互联网上发布的多个页面上调查了这个问题。 所有这些都明确表示应该重写GET方法来模拟POST方法(这意味着提供对5,000个字符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; } 

显然使用WebClient将无法正常工作,因为根据文档 ,您无法根据需要更改标头:

注意:如果要在单个请求中发送更多数据,也可以使用POST来调用API。 POST正文中的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翻译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", "

Hello World

" } }; try { var responseBytes = webClient.UploadValues(GoogleTranslateApiUrl, "POST", data); var json = Encoding.UTF8.GetString(responseBytes); var result = JsonConvert.DeserializeObject(json); var translation = result.data.translations[0].translatedText; } catch (Exception ex) { loggingService.Error(ex.Message); } }

? 什么? 使用C#发布是微不足道的 – 它就在文档中。

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); { // Set type to POST request.Method = "POST"; 

从那时起,您基本上将数据放入fom字段到内容流中。

这不是“模拟post会议”,它完全根据规范做了post请求。

顺便说一句。 json在哪里进入? 你说“在C#”。 没有必要使用json?