1

Bing Translator SOAP API を使用しようとしています (HTTP API では、UTF-8 シリアライゼーションによるそれほど大きなリクエストではないため、414 の「リクエストが長すぎます」を取得しているため)。

そのため、Savon SOAP ツールキットを使用して、 bing_translator gem ソースを HTTP インターフェイスから SOAP インターフェイスに切り替えようとしています。

私のワークフローは次のとおりです(アクセストークン取得機能は示されていません):

WSDL_URI = 'http://api.microsofttranslator.com/V2/soap.svc?wsdl'

get_access_token
client = Savon.client(wsdl: WSDL_URI, headers: {'Authorization' => "Bearer #{@access_token['access_token']}"})

params = {
  'from'        => 'ru',
  'to'          => 'en',
  'text'        => 'Это текст для перевода',
  'category'    => 'general',
  'contentType' => 'text/plain'
}

result = client.call(:translate, message: params)

次に、SOAP リクエストが実行されます。

SOAP request: http://api.microsofttranslator.com/V2/soap.svc

Authorization: Bearer http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=invest_amurobl_ru&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&Audience=http%3a%2f%2fapi.microsofttranslator.com&ExpiresOn=1381128612&Issuer=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&HMACSHA256=Mw41PMMgw2n6ZVaGRXtwfR0vwMJUyIMltIyd9pa9MqA%3d
SOAPAction: "http://api.microsofttranslator.com/V2/LanguageService/Translate"
Content-Type: text/xml;charset=UTF-8
Content-Length: 454

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://tempuri.org/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<wsdl:Translate>
<to>en</to>
<text>Это текст для перевода</text>
<category>general</category>
<contentType>text/html</contentType>
<from>ru</from>
</wsdl:Translate>
</env:Body>
</env:Envelope>

そして、私はエラー500を取得しています:Unhandled Service Exception

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-US">Unhandled Service Exception</faultstring>
<detail>
<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1</int>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>

何が間違っている可能性がありますか?既に Bing Translator SOAP API を使用して、私のソープ メッセージを自分と比較できる人はいますか? これをトラブルシューティングする方法に関するアドバイス。

ご清聴ありがとうございました。

編集:

@SteffenRollerのアドバイスとして、SoapUIでAPIをチェックしましたが、動作します。以下は、SoapUI によって生成された XML です (値は手動で挿入されます)。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://api.microsofttranslator.com/V2">
   <soapenv:Header/>
   <soapenv:Body>
      <v2:Translate>
         <!--Optional:-->
         <v2:text>Текст, который я хочу перевести</v2:text>
         <!--Optional:-->
         <v2:from>ru</v2:from>
         <!--Optional:-->
         <v2:to>en</v2:to>
         <!--Optional:-->
         <v2:contentType>text/plain</v2:contentType>
         <!--Optional:-->
         <v2:category>general</v2:category>
      </v2:Translate>
   </soapenv:Body>
</soapenv:Envelope>

ご覧のとおり、唯一の違いは、 a 内のすべてのタグが<Body>名前v2空間にあることです。Savon によって生成された XML では、この名前空間はまったく存在しません。

それで、問題は次のとおりです。Savonにメッセージ本文内のタグに正しい名前空間を使用するように指示するにはどうすればよいですか?

これは Savon のバグだと思いますが、SoapUI は同じ WSDL で正しい XML を生成し、Savon は生成しないため、開発者に報告します。

4

1 に答える 1

0

わかった。これは既知のバグです: Savon issue #340。これは複合 WSDL ファイルに関連しており、現在のメジャー リリースでは修正されません :-(

したがって、私たちのケースでは、Savon に名前空間とは何か、その名前は何か (WSDL と一致させるため) を伝え、各タグの名前の先頭にこの名前空間を追加する必要があります。

正しいコードは次のようになります。

require 'savon'

access_token = "http%3a%2f%2fschemas.xmlsoap.org%2fws...CA9TEs%3d"

client = Savon.client(
  wsdl: 'http://api.microsofttranslator.com/V2/soap.svc?wsdl',
  namespace: 'http://api.microsofttranslator.com/V2',
  namespace_identifier: :v2,
  headers: {'Authorization' => "Bearer #{access_token}"},
)

params = {
  'v2:text'        => 'Это текст для перевода',
  'v2:from'        => 'ru',
  'v2:to'          => 'en',
  'v2:contentType' => 'text/plain',
  'v2:category'    => 'general',
}

result = client.call(:translate, message: params)

puts result.body[:translate_response][:translate_result]

アドバイスや修正は大歓迎です。ありがとう。

于 2013-10-08T05:53:45.523 に答える