いよいよ自分の RDML コーディングをする時が来ました。
URL の構築には XPRIM_UriBuilder を使用し、JSON 応答の読み込みには XPRIM_RandomAccessJsonReader を使用します。
GoogleTranslateServerModule という名前の新規サーバー・モジュールを作成し、必要なフィールドを宣言します。
Begin_Com Role(*EXTENDS #PRIM_SRVM)
End_Com
最初に次のフィールドを定義します。
Define Field(#TargetLanguage) Type(*NVARCHAR) Length(10)
Define Field(#SourceLanguage) Type(*NVARCHAR) Length(10)
Define Field(#SourceText) Type(*NVARCHAR) Length(500)
Define Field(#TranslatedText) Type(*NVARCHAR) Length(500)
Define Field(#ErrorCode) Type(*NVARCHAR) Length(50)
Define Field(#ErrorMessage) Type(*NVARCHAR) Length(200)
Define Field(#OK) Type(*BOOLEAN)
Translate という名前の新しいサーバー・ルーチンを作成します。
Srvroutine Name(Translate)
Endroutine
次の入力・出力パラメータをサーバー・ルーチンに追加します。
* 入力フィールドの定義
Field_Map For(*INPUT) Field(#SourceText)
Field_Map For(*INPUT) Field(#TargetLanguage)
Field_Map For(*INPUT) Field(#SourceLanguage)
* 出力フィールドの定義
Field_Map For(*OUTPUT) Field(#OK)
Field_Map For(*OUTPUT) Field(#TranslatedText)
Field_Map For(*OUTPUT) Field(#ErrorCode)
Field_Map For(*OUTPUT) Field(#ErrorMessage)
サーバー・ルーチンの最初に以下の変数を宣言します。
Define_Com Class(#XPRIM_HttpRequest) Name(#HttpRequest)
Define_Com Class(#XPRIM_UriBuilder) Name(#Url)
Define_Com Class(#XPRIM_RandomAccessJsonReader) Name(#Reader)
URL ホスト、パスおよびクエリ文字列に値を入れます。
#Url.SetScheme( 'https' )
#Url.SetHost( 'www.googleapis.com' )
#Url.SetPath( '/language/translate/v2' )
#Url.AddQueryString( 'q' #SourceText )
#Url.AddQueryString( 'target' #TargetLanguage )
#Url.AddQueryString( 'format' 'text' )
#Url.AddQueryString( 'source' #SourceLanguage )
#Url.AddQueryString( 'key' '<前のステップで取得した api キー>' )
URL により指定された要求を実行します。
#HttpRequest.DoGet Url(#Url)
次に JSON 応答から翻訳されたテキストを取得する必要があります。
前のステップ (Postman を使用) にもありましたが、JSON 応答の正常時の応答がどのようなものになるか思い出してください。
"翻訳されたテキスト" の値へのパスは次のようになります。
data/translations/1/translatedText
まずは、要求が正常に実行されたかどうかを確認する必要があることを忘れないでください。これは、サーバーからの応答の有無 (IsSucessfulRequest プロパティ)、正常な応答を受信したかどうか (IsSuccessHttpStatusCode) をチェックすることで確認できます。
エラー発生時の JSON 応答を思い出してください。
エラー・メッセージへのパスは以下になります。
error/message
以下は JSON 応答から翻訳されたテキストを抽出するコードです。
* サーバーからの応答の有無を確認
If (#HttpRequest.Response.IsSuccessfulRequest)
* HTTP 応答を JsonReader オブジェクトにフィード
#Reader.SetSourceHttpResponse Httpresponse(#HttpRequest.Response)
* サーバーから正常な応答を取得したか確認
If (#HttpRequest.Response.IsSuccessHttpStatusCode)
* 結果の (翻訳された) テキストを取得
#TranslatedText := #Reader.ReadStringWithPath( 'data/translations/1/translatedText' )
#OK := True
Else
* エラー・コードおよびエラー・メッセージを JSON 応答から取得
#ErrorCode := #Reader.ReadStringWithPath( 'error/code' )
#ErrorMessage := #Reader.ReadStringWithPath( 'error/message' )
#OK := False
Endif
Else
* サーバーからの応答無し
* 応答オブジェクトからの転送エラーを取得
#OK := False
#ErrorCode := #HttpRequest.Response.ErrorCode
#ErrorMessage := #HttpRequest.Response.ErrorMessage
Endif