मैं अपने रेल ऐप में माइक्रोसॉफ्ट के ट्रांसलेटर एपीआई का उपयोग करने की कोशिश कर रहा हूं। दुर्भाग्य से और अधिकतर अप्रत्याशित, सर्वर हमेशा एक आंतरिक सर्वर त्रुटि के साथ उत्तर देता है। मैंने इसे पोस्टर [1] के साथ मैन्युअल रूप से भी आजमाया और मुझे वही परिणाम मिले।

अधिक विस्तार से, मैं क्या कर रहा हूँ? मैं एक एक्सएमएल स्ट्रिंग बना रहा हूं जो अनुरोध के मुख्य भाग में जाता है। मैंने API प्रलेखन के C# उदाहरण का उपयोग किया। ठीक है, और फिर मैं सिर्फ RESTservice को लागू कर रहा हूँ। मेरा कोड इस तरह दिखता है:

xmlns1 = "http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2"
xmlns2 = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"

xml_builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
  xml.TranslateArrayRequest("xmlns:ms" => xmlns1, "xmlns:arr" => xmlns2) {
     xml.AppId token  #using temporary token instead of appId
     xml.From  source
     xml.To    target

     xml.Options {
       xml["ms"].ContentType {
         xml.text "text/html"
       }
     }

     xml.Texts {
       translate.each do |key,val|
          xml["arr"].string {
            xml.text CGI::unescape(val)
          }
       end
     }
   }
end

headers = {
   'Content-Type' => 'text/xml'
}

uri = URI.parse(@@msTranslatorBase + "/TranslateArray" + "?appId=" + token) 
req = Net::HTTP::Post.new(uri.path, headers)
req.body = xml_builder.to_xml

response = Net::HTTP.start(uri.host, uri.port) { |http| http.request(req) }
# [...]

xml_builder निम्न XML जैसा कुछ उत्पन्न करता है। एपीआई पेज से अलग उदाहरण के लिए, मैं कुछ टैग पर उन्हें संदर्भित करने के बजाय दो नामस्थान परिभाषित कर रहा हूं (मुख्यतः क्योंकि मैं ओवरहेड को कम करना चाहता था) - लेकिन यह कोई समस्या नहीं लगती है, जब मैं करता हूं यह दस्तावेज़-उदाहरण की तरह मुझे एक आंतरिक सर्वर त्रुटि भी मिलती है।

<?xml version="1.0" encoding="UTF-8"?>
<TranslateArrayRequest xmlns:ms="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <AppId>TX83NVx0MmIxxCzHjPwo2_HgYN7lmWIBqyjruYm7YzCpwnkZL5wtS5oucxqlEFKw9</AppId>
  <From>de</From>
  <To>en</To>
  <Options>
    <ms:ContentType>text/html</ms:ContentType>
  </Options>
  <Texts>
    <arr:string>Bitte übersetze diesen Text.</arr:string>
    <arr:string>Das hier muss auch noch übersetzt werden.</arr:string>
  </Texts>
</TranslateArrayRequest>

हर बार जब मैं उस सेवा का अनुरोध करता हूं जिसका वह उत्तर देता है

#<Net::HTTPInternalServerError 500 The server encountered an error processing the request. Please see the server logs for more details.>

... सिवाय इसके कि मैं कुछ अनिर्दिष्ट चीजें करता हूं, जैसे POST के बजाय GET का उपयोग करना, फिर यह "विधि की अनुमति नहीं है" जैसी किसी चीज़ के साथ उत्तर देता है।

मैंने सोचा कि यह एक्सएमएल सामग्री के साथ कुछ गलत हो सकता है, क्योंकि मैं एक AppIdToken का अनुरोध कर सकता हूं और अनुवाद विधि बिना किसी समस्या के। लेकिन मेरे लिए, एक्सएमएल ठीक दिखता है। प्रलेखन में कहा गया है कि अपेक्षित एक्सएमएल के लिए एक स्कीमा है:

अनुरोध निकाय http:// api.microsofttranslator.com/v2/Http.svc/help पर निर्दिष्ट स्कीमा के अनुसार उत्पन्न एक xml स्ट्रिंग है

दुर्भाग्य से, मुझे उस पर कुछ भी नहीं मिल रहा है।

तो अब मेरा प्रश्न: क्या मैं कुछ गलत कर रहा हूँ? हो सकता है कि किसी ने समान परिस्थितियों का अनुभव किया हो और समाधान या कार्य-आसपास पर रिपोर्ट कर सकता है?


[1] पोस्टर एफएफ प्लगइन > addons.mozilla.org/en-US/firefox/addon/poster/

2
Brian 7 जून 2011, 12:29

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है, बहुत सारे परीक्षण और त्रुटि के बाद मुझे लगता है कि मैंने इसे बनाया है। तो अगर किसी को भी इसी तरह की समस्या है, तो मैंने इसे कैसे ठीक किया है:

जाहिर है, एपीआई आने वाले एक्सएमएल के साथ उधम मचाता है। लेकिन चूंकि कोई स्कीमा नहीं है (या कम से कम मुझे दस्तावेज़ीकरण में निर्दिष्ट एक नहीं मिला) इसे सही तरीके से करना मुश्किल है: टैग का क्रम महत्वपूर्ण है!

<TranslateArrayRequest>
  <AppId/>
  <From/>
  <Options />
  <Texts/>
  <To/>
</TranslateArrayRequest>

जब एक्सएमएल में यह ऑर्डरिंग होता है तो यह काम करता है। अन्यथा आप केवल बेकार आंतरिक सर्वर त्रुटि प्रतिक्रिया देखेंगे। इसके अलावा, मैंने कई बार पढ़ा है कि अगर एक्सएमएल में अनुचित यूटीएफ -8 है तो एपीआई भी टूट जाती है। कोई अविश्वसनीय बल लगा सकता है UTF-8 (उदाहरण के लिए उपयोगकर्ता प्रपत्र से आ रहा है) इस प्रकार:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
4
Community 23 मई 2017, 15:29
1
प्रश्न का उत्तर देने के लिए धन्यवाद, मैं भी यहां शामिल होना चाहता था। यह एक्सएमएल में कुछ पात्रों को पसंद नहीं करता है, भले ही आपने इसे utf8 के रूप में स्वरूपित किया हो। मेरे पास "<" और ">" वर्णों के साथ एक स्ट्रिंग है और यदि उस स्ट्रिंग को पास किया जाता है तो मुझे अनुवादअरे एपीआई से 500 त्रुटि मिलेगी। अन्य सभी तार ठीक हैं।
 – 
devshorts
17 जिंदा 2013, 02:46
मेरी पिछली प्रतिक्रिया को ठीक करने के लिए, बस सुनिश्चित करें कि सभी एक्सएमएल ठीक से बच निकले हैं।
 – 
devshorts
2 फरवरी 2013, 19:32