Pergunta

Eu estou testando um serviço web com soapUI. Uma das respostas esta aparência:

    <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>

A resposta é um array de bytes, que deve representar um arquivo zip. Como posso ir sobre a verificação isso?

Foi útil?

Solução

Embora semanticamente correta, acredito que a solução proposta por Nathan é um pouco incompleto.

Eu acho que ele se esqueceu de fazer Base64 decodificar o texto extraído antes do passo 1. Também gostaria de incluir uma melhoria de modo a que nenhuma intervenção humana é necessária, verificando o arquivo temporário usando 3rd party ZIP utilitários.

Isso se traduziria em acessando o arquivo ZIP temporário e verificar se ele é um arquivo ZIP válido. Portanto, um algoritmo para implementar sua exigência seria:

    text
  1. Acesso elemento codificado em Base64 conteúdo e Base64 decodificá-lo
  2. Saída ZIP texto bruto em um arquivo temporário, criando um arquivo ZIP
  3. Verifique se o arquivo ZIP temporariamente criado é válido

Com tudo isso em mente, aqui está como o script Groovy completa seria algo como:

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")

Por favor, deixe-me saber se isso funciona para você como faz para mim. : -)

Felicidades!
Shonzilla

P.S. Gostaria de sugerir a adição de tag "ZIP" a esta pergunta de modo que as pessoas possam mais facilmente encontrar uma solução para lidar com ZIPs de Groovy que está embutidos aqui.

Outras dicas

Você vai ter que usar algum Groovy.

  1. saída da matriz de bytes em um arquivo.
  2. executar alguma linha de comando (7zip, zip whatever) com uma produção você pode analisar.
  3. Certifique-se que é a saída correta.

Edit:. Adicionado um código de exemplo

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top