Frage

Ich teste einen Web-Service mit soapUI. Eine der Antworten sieht wie folgt aus:

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

Die Antwort ist ein Byte-Array, das eine Zip-Datei darstellen sollte. Wie kann ich über die Überprüfung dieses gehen?

War es hilfreich?

Lösung

Obwohl semantisch korrekt, glaube ich, Nathans Lösungsvorschlag etwas unvollständig ist.

Ich glaube, er tut Base64 vergessen hat, bevor die extrahierten Text entschlüsseln Schritt 1. Ich auch eine Verbesserung umfassen würde, so dass kein menschliches Eingreifen durch die Überprüfung der temporäre Datei mit ZIP-Dienstprogramme 3rd-Party benötigt wird.

Das würde übersetzen in die temporäre ZIP-Datei zuzugreifen und zu prüfen, ob es eine gültige ZIP-Datei ist. Daher ist ein Algorithmus für Ihre Anforderung Umsetzung wäre:

  1. Zugriffselement Base64-codierten Text Inhalt und Base64 dekodieren
  2. Ausgabe ZIP Rohtext in eine temporäre Datei, so dass eine ZIP-Datei erstellen
  3. Überprüfen Sie, ob die vorübergehend erstellt ZIP-Datei ist gültig

Mit allem daran, hier ist, wie die komplette Groovy Skript aussehen würde:

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

Bitte lassen Sie mich wissen, ob dies für Sie funktioniert, wie es für mich tut. : -)

Cheers!
Shonzilla

P. S. Ich würde vorschlagen, „ZIP“ Tag auf diese Frage hinzugefügt, damit die Menschen leichter, eine Lösung für die Handhabung ZIPs von Groovy finden, die hier eingebettet ist.

Andere Tipps

Sie gehen zu müssen, etwas groovy verwenden.

  1. Ausgang des Byte-Array in eine Datei.
  2. ausführen eine Befehlszeile (7-Zip, zip was auch immer) mit einem Ausgang können Sie analysieren.
  3. stellen Sie sicher, es ist die richtige Ausgabe.

Edit:. Hinzugefügt einige Beispiel-Code

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top