【问题标题】:Microsoft Translator API answers 500 internal server errorMicrosoft Translator API 回答 500 内部服务器错误
【发布时间】:2011-09-09 21:22:57
【问题描述】:

我正在尝试在我的 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 有一个模式:

请求正文是根据 http://api.microsofttranslator.com/v2/Http.svc/help 指定的架构生成的 xml 字符串

很遗憾,我在上面找不到任何东西。

所以现在我的问题是:我做错了什么吗?也许有人遇到过类似情况并可以报告解决方案或变通方法?


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

【问题讨论】:

    标签: ruby-on-rails xml api rest


    【解决方案1】:

    好吧,经过多次反复试验,我想我做到了。所以如果有人有类似的问题,我是这样解决的:

    显然,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]
    

    【讨论】:

    • 感谢您回答问题,我也想在这里插话。即使您将其格式化为 utf8,它也不喜欢 XML 中的某些字符。我有一个带有“”字符的字符串,如果传入该字符串,我将从 translateArray API 收到 500 错误。所有其他字符串都很好。
    • 要更正我上次的回复,只需确保所有 XML 都已正确转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2015-11-08
    • 2017-10-28
    相关资源
    最近更新 更多