Pregunta

Estoy probando un servicio web con soapUI. Una de las respuestas se ve así:

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

La respuesta es una matriz de bytes que debe representar un archivo zip. ¿Cómo puedo verificar esto?

¿Fue útil?

Solución

Aunque semánticamente correcto, creo que la solución propuesta de Nathan es algo incompleta.

Supongo que olvidó decodificar Base64 el texto extraído antes del paso 1. También incluiría una mejora para que no se necesite intervención humana al verificar el archivo temporal utilizando utilidades ZIP de terceros.

Eso se traduciría en acceder al archivo ZIP temporal y verificar si es un archivo ZIP válido. Por lo tanto, un algoritmo para implementar su requisito sería:

  1. Elemento de acceso Texto codificado en Base64 contenido y Base64 lo decodifican
  2. Salida de texto sin formato ZIP en un archivo temporal, creando así un archivo ZIP
  3. Compruebe si el archivo ZIP creado temporalmente es válido

Con todo eso en mente, así es como se vería el script Groovy completo:

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

Avíseme si esto funciona para usted como lo hace para mí. :-)

¡Salud!
Shonzilla

p.s. Sugeriría agregar " ZIP " etiqueta esta pregunta para que las personas puedan encontrar más fácilmente una solución para manejar ZIPs de Groovy que está incrustada aquí.

Otros consejos

Tendrás que usar algo maravilloso.

  1. genera la matriz de bytes en un archivo.
  2. ejecute alguna línea de comando (7zip, zip) con una salida que pueda analizar.
  3. asegúrese de que sea la salida correcta.

Editar: se agregó un código de muestra.

def saveFile = new java.io.File (saveTestDir + " \\ testreturn.zip ")

FileOutputStream fos = new java.io.FileOutputStream (saveFile);

def zipBytes = context.expand ('$ {Paso # Solicitud # // ns2: getInputConfigFilesResponse [1] / return [1]}');

fos.write (zipBytes.getBytes ());

fos.flush();

fos.close();

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top