代码之家  ›  专栏  ›  技术社区  ›  carrier

如何从soapUI响应中提取字节数组?

  •  2
  • carrier  · 技术社区  · 16 年前

    我正在用soapUI测试一个web服务。其中一个答案看起来像这样:

        <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 回复  |  直到 16 年前
        1
  •  5
  •   Shonzilla    16 年前

    虽然语义正确,但我认为Nathan提出的解决方案有些不完整。

    我猜他忘了在步骤1之前对提取的文本进行Base64解码。我还将包括一项改进,通过使用第三方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”标签,这样人们就可以更容易地找到处理嵌入在这里的Groovy中的ZIP的解决方案。

        2
  •  0
  •   Nathan    16 年前

    你必须使用一些时髦的东西。

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