如何在断言中正确编写 groovy 脚本以解码响应并以 pdf 格式接收?

How to correctly write groovy script in assertion to decode response and recive it in pdf?

我正在尝试从 'rest request' 通过断言脚本响应接收带有内容的 pdf 文档。 我尝试了几种方法,但对于每一种方法,结果都与预期不同。 您能否查看我的几个选项并提出一些解决方案? 这是我使用 'groovy scripts' 的第一步,我对 endcode/decode 功能不太熟悉,所以如果我犯了一些大错误,请理解 提前致谢。

//选项编号1

import org.apache.commons.codec.binary.Base64; 
import groovy.json.JsonSlurper
import com.itextpdf.text.*
import com.itextpdf.text.pdf.PdfWriter;

def content = messageExchange.response.responseContent
def cont = messageExchange.response.responseContent
def fileName = messageExchange.modelItem.testStep.testCase.getPropertyValue("DOC") + '_test.pdf'
Base64 coder = new Base64();
//assert null != response, "response is null"
def encodedString = cont.getBytes("UTF-8").encodeBase64().toString()
def decoded = encodedString.decodeBase64();
def res = new File( "F:\Test\Testing\Files\assertion\$fileName")
res.write(content, "UTF-8")
res.delete();
res << encodedString
log.info res

结果:

我期待 pdf 内容正确的文档。

来自选项 1 我能够收到 pdf 文件,其内容仍然像这样编码: "JVBERi0xLjQNCiXvv73vv73vv73vv70NCjEgMCBvYmoKPDwKL0F1dGhvciAoQW5ua2F0aHJpbi BTdGVwaGFuKQovQ3JlYXRpb25EYXRlIChEOjIwMTkwNDE4MTcwNTI2KzAzJzAwJykKL0NyZWF0 b3IgKFBERi1YQ2hhbmdlIE9mZmljZSBBZGRpbikKL0NyZWF0b3JUb29sIChQREYtWENoYW5nZS...

//选项2

import org.apache.commons.codec.binary.Base64; 
import groovy.json.JsonSlurper
import com.itextpdf.text.*
import com.itextpdf.text.pdf.PdfWriter;

def content = messageExchange.response.responseContent
def cont = messageExchange.response.responseContent
def fileName = messageExchange.modelItem.testStep.testCase.getPropertyValue("DOC") + '_test.pdf'
Base64 coder = new Base64();
//assert null != response, "response is null"
def encodedString = cont.getBytes("UTF-8").encodeBase64().toString()
def decoded = encodedString.decodeBase64();
def res = new File( "F:\Test\Testing\Files\assertion\$fileName")
res.write(content, "UTF-8")
//res.delete(); -> without this line 
res << encodedString
log.info res

我期待的是包含正确 pdf 内容的文档。 结果: 来自选项 2 - 创建的文件有 2 个空白页

//选项3

import org.apache.commons.codec.binary.Base64; 
import groovy.json.JsonSlurper
import com.itextpdf.text.*
import com.itextpdf.text.pdf.PdfWriter;

def fileName = messageExchange.modelItem.testStep.testCase.getPropertyValue("DOC_PID") + '_test.pdf'
def cont = messageExchange.response.responseContent
String content = cont
def encoded = content.getBytes("UTF-8").encodeBase64().toString()
byte[] decoded = encoded.decodeBase64()
def document = new Document()
PdfWriter.getInstance(document,new FileOutputStream(fileName));

我期待的是包含正确 pdf 内容的文档。 结果: 来自选项 3 - 我收到错误 window 消息“文件名(访问被拒绝)

哪个选项最好?以及如何改进它?


*感谢您的回复,起初我需要承认我犯了错误,我采用了错误的回复类型 'Raw',我应该使用具有正确回复的 'XML'。此外,我在 'Max size' 属性 中有限制,这影响了响应。现在我设置了正确的大小,并更改了响应的内容。代码看起来像这样:

import com.eviware.soapui.support.XmlHolder
def cont = new XmlHolder(messageExchange.responseContentAsXml)
content = cont["//*:data"]
def fileName = messageExchange.modelItem.testStep.testCase.getPropertyValue("DOC") + '_test.pdf'
new File( "F:\Test\Testing\Files\assertion\$fileName").bytes = content.decodeBase64()

断言已通过,但 pdf 文件仍然有空白页。我确定这是 Base64 编码的文档,我需要对其进行解码。

对我有用的最终解决方案是(但请记住在 Base64 编码的 JSON 中有响应):

import org.apache.commons.codec.binary.Base64; 
import groovy.json.JsonSlurper
//grab the response
def content = messageExchange.response.responseContent
def jsonSlurper = new JsonSlurper().parseText(content)
assert !(jsonSlurper.isEmpty())
document_content = jsonSlurper.fileContent
def fileName = messageExchange.modelItem.testStep.testCase.getPropertyValue("DOC") + '_.pdf'
new File( ""F:\Test\Testing\Files\assertion\$fileName"").bytes = document_content.decodeBase64()

log.info fileName

如果响应内容包含 base64 编码的 pdf,那么以下应该可以将解码后的 pdf 写入文件:

def content = messageExchange.response.responseContent
new File( "F:\Test\Testing\Files\assertion\$fileName").bytes = content.decodeBase64()

groovy 中的字符串具有内置方法 decodeBase64() returns 将内容解码为字节

然后你只需要write bytes到一个文件中。