2012-02-24 29 views
6

Tôi đã triển khai mã C# bằng cách sử dụng api Phiên dịch Google V2 bằng Phương thức GET. Dịch thành công các văn bản nhỏ nhưng khi tăng độ dài văn bản và mất 1.800 ký tự (bao gồm các thông số URI), tôi nhận được lỗi "URI quá lớn".Google Translate V2 không thể hanlde bản dịch văn bản lớn từ C#

Ok, tôi đã đốt cháy tất cả các đường dẫn và điều tra vấn đề trên nhiều trang được đăng trên Internet. Tất cả chúng đều nói rõ ràng phương thức GET nên được overriden để mô phỏng một phương thức POST (có nghĩa là cung cấp hỗ trợ cho 5.000 URI ký tự) nhưng không có cách nào để tìm ra một ví dụ mã cho nó.

Có ai có ví dụ nào hoặc có thể cung cấp một số thông tin không?

[EDIT] Đây là mã Tôi đang sử dụng:

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; 
    } 
+0

Bạn có thể cho chúng tôi biết mã bạn hiện đang sử dụng không? Chiến lược này hơi khác nếu bạn đang sử dụng 'WebClient' so với' WebRequest'. – user7116

Trả lời

7

Rõ ràng sử dụng WebClient sẽ không làm việc như bạn không thể thay đổi các tiêu đề khi cần thiết, per the documentation:

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 the X-HTTP-Method-Override header to tell the Translate API to treat the request as a GET (use X-HTTP-Method-Override: GET).

Bạn có thể sử dụng WebRequest, nhưng bạn sẽ cần phải thêm X-HTTP-Method-Override tiêu đề:

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); 
} 
+0

Cảm ơn bạn đã phản hồi nhanh chóng. Tôi đã thêm mã tôi đang thực thi. Tôi cũng đã đào sâu vào mã bạn đã đăng và tôi có thể cập nhật tài khoản của tôi để tạo bài đăng như bạn đã chỉ ra. Tuy nhiên, khi thực hiện "request.GetResponse();" lỗi sau được nêu lên: "Máy chủ từ xa trả về lỗi: (400) Yêu cầu không hợp lệ". Sẽ xem xét điều này. – G21

+0

@ George_21: bạn cần loại bỏ các tham số khỏi URL và đặt tất cả chúng vào phần nội dung bài đăng. – user7116

+1

Bạn là anh hùng của tôi! : P. Cuối cùng tôi đã có thể viết lại mã của tôi theo đề xuất của bạn và cũng thêm một dòng bị thiếu: "request.ContentType =" application/x-www-form-urlencoded "; Thực sự đánh giá cao sự giúp đỡ của bạn về điều này! Thankssss! – G21

-3

? Gì? nó là tầm thường để gửi bằng cách sử dụng C# - nó là ngay trong tài liệu.

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

Từ đó bạn đặt dữ liệu vào trường fom vào luồng nội dung.

Đây không phải là "mô phỏng một bài viết đáp ứng", nó hoàn toàn làm một yêu cầu đăng bài theo thông số kỹ thuật.

Btw. json nhập ở đâu? Bạn nói "in C#". Không cần sử dụng json?

+0

Không xử lý phần "Ghi đè phương pháp X-HTTP". – Suma

1

Câu trả lời được chấp nhận dường như đã lỗi thời. Bây giờ bạn có thể sử dụng WebClient (.net 4.5) thành công để POST vào API dịch google đảm bảo đặt tiêu đề X-HTTP-Method-Override.

Dưới đây là một số mã để cho bạn biết cách thực hiện.

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); 
    } 
} 
Các vấn đề liên quan