Как извлечь массив байтов из ответа soapUI? - PullRequest
2 голосов
/ 21 января 2009

Я тестирую веб-сервис с soapUI. Один из ответов выглядит так:

    <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-файл. Как я могу проверить это?

Ответы [ 2 ]

5 голосов
/ 16 июня 2009

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

Полагаю, он забыл, что Base64 декодирует извлеченный текст до шага 1. Я бы также включил улучшение, чтобы не требовалось вмешательства человека при проверке временного файла с использованием сторонних утилит ZIP.

Это приведет к доступу к временному ZIP-файлу и проверке, является ли он действительным ZIP-файлом. Следовательно, алгоритм для реализации вашего требования будет:

  1. Элемент доступа к тексту в кодировке Base64 контент и Base64 его декодируют
  2. Вывод необработанного ZIP-текста во временный файл, создавая таким образом ZIP-файл
  3. Проверить, является ли временно созданный 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")

Пожалуйста, дайте мне знать, работает ли это для вас так же, как и для меня. : -)

Ура!
Shonzilla

p.s. Я бы предложил добавить тег «ZIP» к этому вопросу, чтобы людям было легче найти решение для обработки ZIP-файлов из Groovy, встроенное здесь.

0 голосов
/ 03 февраля 2009

Тебе придётся использовать что-нибудь заводное.

  1. вывод байтового массива в файл.
  2. выполнить некоторую командную строку (7zip, zip и т. Д.) С выводом, который вы можете проанализировать.
  3. убедитесь, что это правильный вывод.

Редактировать: добавлен пример кода.

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();

...