我正在尝试在我的 Rails 应用程序中使用 Microsoft 的 Translator API。不幸的是,而且大多数情况是出乎意料的,服务器总是以内部服务器错误来回答。我还用 Poster[1] 手动尝试过,得到了相同的结果。
更详细地说,我在做什么?我正在创建一个 XML 字符串,该字符串将放入请求正文中。我使用了 API documentation 的 C# 示例。好吧,然后我只是调用 REST 服务。 我的代码如下所示:
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 的内容。与 API 页面的示例不同,我定义了两个命名空间,而不是在某些标签上引用它们(主要是因为我想减少开销)——但这似乎不是问题,当我这样做时就像文档示例一样,我也收到内部服务器错误。
<?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.>
...除了我做了一些未指定的事情,例如使用 GET 而不是 POST,然后它会回答“不允许的方法”之类的内容。
我认为 XML 内容可能有问题,因为我可以请求 AppIdToken 并调用 Translate method没有什么问题。但对我来说,XML 看起来很好。文档指出有一个预期 XML 的架构:
The request body is a xml string generated according to the schema specified at http:// api.microsofttranslator.com/v2/Http.svc/help
不幸的是,我找不到任何相关内容。
现在我的问题是:我做错了什么吗?也许有人经历过类似的情况并可以报告解决方案或解决方法?
[1] 海报 FF 插件 > addons.mozilla.org/en-US/firefox/addon/poster/
最佳答案
好吧,经过多次尝试和错误,我想我成功了。因此,如果有人遇到类似的问题,我是这样解决这个问题的:
显然,API 对传入的 XML 有点挑剔。但由于没有模式(或者至少我找不到文档中指定的模式),因此很难以正确的方式做到这一点:标签的顺序至关重要!
<TranslateArrayRequest>
<AppId/>
<From/>
<Options />
<Texts/>
<To/>
</TranslateArrayRequest>
当 XML 具有此顺序时,它就可以工作。否则你只会看到无用的内部服务器错误响应。此外,我多次读到,如果 XML 包含不正确的 UTF-8,API 也会中断。一 jar force untrusted UTF-8 (例如来自用户表单)这样:
ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
关于ruby-on-rails - Microsoft Translator API 回答 500 内部服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6262543/