Microsoft Translator API回答500内部服务器错误

时间:2011-06-07 08:29:12

标签: ruby-on-rails xml api rest

我正在尝试在我的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页面中的示例不同,我定义了两个名称空间而不是在某些标记上引用它们(主要是因为我想减少开销) - 但这似乎不是问题,当我这样做时像docu-example一样,我也收到内部服务器错误。

<?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的模式:

  

请求正文是根据http:// api.microsofttranslator.com/v2/Http.svc/help

中指定的架构生成的xml字符串

不幸的是,我找不到任何相关内容。

所以现在我的问题:我做错了吗?也许有人经历过类似的情况,可以报告解决方案或解决方案吗?


[1]海报FF插件&gt; addons.mozilla.org/en-US/firefox/addon/poster /

1 个答案:

答案 0 :(得分:4)

好吧,经过多次试错,我想我已经成功了。所以如果有人有类似的问题,我就是这样解决的:

显然,API对传入的XML有点挑剔。但由于没有架构(或者至少我找不到文档中指定的架构),所以很难以正确的方式执行:标签的排序至关重要!

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

当XML具有这种排序时,它可以工作。否则,您将只看到无用的内部服务器错误响应。此外,我读了几次,如果XML包含不正确的UTF-8,API也会中断。可以force untrusted UTF-8(例如来自用户表单)这样:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]