soapUI応答からバイト配列を抽出するにはどうすればよいですか?
質問
soapUIでWebサービスをテストしています。応答の1つは次のようになります。
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getInputConfigFilesResponse xmlns:ns2="http://ws.pdb.ericsson.se/">
<return>UEsDBBQACAAIAO1GNToAAAAAAAAAAAAAAAANAAAAc2NyaXB0cy9lbGxza [...] AATAAAAAAAAAAAAAAAAAAGXAAAbGRhcF9ub2RlX2NvbmZpZ3VyYXRpb24vZ2VuZXJhdGVkX2xkaWZfZmlsZXMvX210YXM0X2N4cDQ0NF9yNF9JbXNtb2JpbGUubGRpZlBLAQIUABQACAAIAO1GNTp8eBuZRAEAABMDAAAmAAAAAAAAAAAAAAAAAKJiAABsZGFwX25vZGVfY29uZmlndXJhdGlvbi9lbGxzaC1jb21tYW5kc1BLBQYAAAAABQAFAIgBAAA6ZAAAAAA=</return>
</ns2:getInputConfigFilesResponse>
</S:Body>
</S:Envelope>
応答は、zipファイルを表すバイト配列です。これを検証するにはどうすればよいですか?
解決
意味的には正しいが、ネイサンが提案した解決策はやや不完全だと思う。
ステップ1の前に、抽出されたテキストをBase64でデコードするのを忘れていたと思います。サードパーティのZIPユーティリティを使用して一時ファイルを検証することにより、人間の介入が不要になるように改善も含めます。
それは、一時的なZIPファイルにアクセスし、それが有効なZIPファイルであるかどうかをチェックすることに変換されます。したがって、要件を実装するためのアルゴリズムは次のようになります。
- アクセス要素Base64でエンコードされたテキスト コンテンツとBase64でデコードする
- ZIP生テキストを一時ファイルに出力し、ZIPファイルを作成します
- 一時的に作成されたZIPファイルが有効かどうかを確認します
これらすべてを念頭に置いて、完全なGroovyスクリプトは次のようになります。
import org.apache.commons.codec.binary.Base64
// Step 1: Access element Base64-encoded text content and Base64 decode it
String tempZipFilename = "temp.zip"
def textBase64 = context.expand(
'${Step#Request#//ns2:getInputConfigFilesResponse[1]/return[1]}' )
def b64 = new Base64()
def zipTextBytes = b64.decode(textBase64.getBytes())
// Step 2: Output ZIP raw text into a temporary file
def zipFile = new java.io.File(tempZipFilename)
FileOutputStream fos = new java.io.FileOutputStream(zipFile)
fos.write( zipTextBytes )
fos.flush()
fos.close()
log.info "Temporary ZIP file stored as: ${zipFile.getCanonicalPath()}"
// Step 3: Check if the temporarily created ZIP file is valid
boolean responseValid
try {
zipFile = new java.util.zip.ZipFile(tempZipFilename)
responseValid = true
log.info "Number of files in the ZIP file: ${zipFile.size()}"
} catch (java.util.zip.ZipException e) {
responseValid = false
log.error "The received response contains a bad ZIP"
}
log.info "Web service response is " + (responseValid ? "valid" : "invalid")
これが私と同じようにあなたのために働くかどうか私に知らせてください。 :-)
乾杯!
ショニラ
p.s。 <!> quot; ZIP <!> quot;を追加することをお勧めします。この質問にタグを付けて、GroovyのZIPをここに埋め込まれたものを処理するためのソリューションを見つけやすくします。
他のヒント
いくつかのグルーヴィーを使用する必要があります。
- バイト配列をファイルに出力します。
- 解析可能な出力を使用して、いくつかのコマンドライン(7zip、zipなど)を実行します。
- 正しい出力であることを確認してください。
編集:サンプルコードを追加しました。
def saveFile = new java.io.File(saveTestDir + "\\testreturn.zip")
FileOutputStream fos = new java.io.FileOutputStream(saveFile);
def zipBytes = context.expand( '${Step#Request#//ns2:getInputConfigFilesResponse[1]/return[1]}' );
fos.write( zipBytes.getBytes() );
fos.flush();
fos.close();