Domanda

Sto testando un servizio Web con soapUI. Una delle risposte è simile alla seguente:

    <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 risposta è un array di byte che dovrebbe rappresentare un file zip. Come posso fare per verificarlo?

È stato utile?

Soluzione

Anche se semanticamente corretta, credo che la soluzione proposta da Nathan sia in qualche modo incompleta.

Suppongo che abbia dimenticato di decodificare Base64 il testo estratto prima del passaggio 1. Includerei anche un miglioramento in modo che non sia necessario alcun intervento umano verificando il file temporaneo utilizzando utility ZIP di terze parti.

Ciò si tradurrebbe in accesso al file ZIP temporaneo e verifica se si tratta di un file ZIP valido. Pertanto, un algoritmo per implementare il tuo requisito sarebbe:

  1. Accedi al testo con codifica Base64 contenuto e Base64 lo decodificano
  2. Output del testo non elaborato ZIP in un file temporaneo, creando così un file ZIP
  3. Verifica se il file ZIP creato temporaneamente è valido

Tenendo presente tutto ciò, ecco come apparirebbe lo 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")

Per favore fatemi sapere se questo funziona per voi come per me. : -)

Cheers!
Shonzilla

P.S. Suggerirei di aggiungere " ZIP " taggare a questa domanda in modo che le persone possano trovare più facilmente una soluzione per la gestione di ZIP da Groovy che è incorporata qui.

Altri suggerimenti

Dovrai usare un po 'di groovy.

  1. genera l'array di byte in un file.
  2. esegui qualche riga di comando (7zip, zip qualunque) con un output che puoi analizzare.
  3. assicurati che sia l'output corretto.

Modifica: aggiunto del codice di esempio.

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

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

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

fos.write (zipBytes.getBytes ());

fos.flush ();

fos.close ();

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top