मैं अपने रेल ऐप में माइक्रोसॉफ्ट के ट्रांसलेटर एपीआई का उपयोग करने की कोशिश कर रहा हूं। दुर्भाग्य से और अधिकतर अप्रत्याशित, सर्वर हमेशा एक आंतरिक सर्वर त्रुटि के साथ उत्तर देता है। मैंने इसे पोस्टर [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/
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]
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
ruby-on-rails
रूबी ऑन रेल्स रूबी में लिखा गया एक ओपन सोर्स फुल-स्टैक वेब एप्लिकेशन फ्रेमवर्क है। यह लोकप्रिय एमवीसी फ्रेमवर्क मॉडल का अनुसरण करता है और इसे "कॉन्फिगरेशन ओवर कॉन्फिगरेशन" अप्रोच डेवलपमेंट के दृष्टिकोण के लिए जाना जाता है।