Microsoft Translator API отвечает на 500 внутренних ошибок сервера - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь использовать Microsoft Translator API в моем приложении Rails.К сожалению и в основном неожиданно, сервер всегда отвечает внутренней ошибкой сервера.Я также попробовал это вручную с Poster [1], и я получил те же результаты.

Более подробно, что я делаю?Я создаю строку XML, которая входит в тело запроса.Я использовал C # Пример документации API .Ну, а потом я просто вызываю 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.В отличие от примера со страницы 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Метод без проблем.Но для меня XML выглядит просто отлично.В документации говорится, что существует схема для ожидаемого XML:

Тело запроса представляет собой строку XML, сгенерированную в соответствии со схемой, указанной по адресу http: // api.microsofttranslator.com/v2/Http.svc / help

К сожалению, я ничего не могу найти по этому поводу.

Итак, теперь мой вопрос (-ы): я что-то не так делаю?Может быть, кто-то сталкивался с подобными ситуациями и может сообщить о решениях или обходных решениях?


[1] Плагин FF для постеров> addons.mozilla.org/en-US/firefox/addon/poster/

1 Ответ

4 голосов
/ 10 июня 2011

Ну, после множества проб и ошибок, я думаю, что сделал это. Так что в случае, если у кого-то есть подобные проблемы, вот как я это исправил:

По-видимому, API немного суетлив с входящим XML. Но поскольку схемы нет (или, по крайней мере, я не смог найти ту, которая указана в документации), сделать это правильно сложно: порядок тегов имеет решающее значение!

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

Когда у XML такой порядок, он работает. В противном случае вы увидите только бесполезную внутреннюю ошибку сервера. Кроме того, я пару раз читал, что API также ломается, если XML содержит неправильный UTF-8. Можно заставить ненадежного UTF-8 (например, исходя из формы пользователя) следующим образом:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...