API GET响应返回正文中的图像,如下所示:这不是附件。
Date : Fri, 05 May 2017 12:26:00 GMT
status : HTTP/1.1 200 OK
Content-Length : 12888
Content-Type : image/jpeg
Server : Apache-Coyote/1.1
X-Content-Type-Options : nosniff
Cache-Control : no-cache
Cache-Control : no-store
Cache-Control : max-age=0
ÿØÿà JFIF ` ` ÿáÈExif MM * 2 J; ^GF GI ? ‡i
f Æ2009:03:12 13:48:28 Corbis ? œ? °’‘ 17 ’’ 17
2008:02:11 11:32:43 2008:02:11 11:32:43 ( $
œ ` ` ÿØÿÛ C
$.' ",#(7),01444'9=82<.342ÿÛ C
2!!2 ...... and so on.
邮差解码图像显示它,在这种情况下它是动物。
我必须使用soapUI中的groovy脚本将响应存储为图像文件(.jpg)(soapUI用于测试API)
这是我在Groovy Script步骤中尝试过的,但保存的图像难以理解。
testRunner.runTestStepByName("GETjpg");
def getImageResponse =
context.testCase.testSteps["GETjpg"].getPropertyValue("Response");
byte[] imageData = getImageResponse.getBytes();
// Converting Image byte array into Base64 String
String imageDataString = encodeImage(imageData);
// Converting a Base64 String into Image byte array
byte[] imageByteArray = decodeImage(imageDataString);
// Write a image byte array into file system
FileOutputStream imageOutFile = new FileOutputStream("C:\\animal.jpg");
imageOutFile.write(imageByteArray);
imageOutFile.close();
public static String encodeImage(byte[] imageByteArray) {
return new sun.misc.BASE64Encoder().encode(imageByteArray);
}
public static byte[] decodeImage(String imageDataString) {
return new sun.misc.BASE64Decoder().decodeBuffer(imageDataString);
}
我想我正在做的以.jpg格式保存图像是不正确的。有人可以帮忙吗?
答案 0 :(得分:1)
这就是我这样做的方式。从http GET请求的脚本断言。希望它可以帮助某人。
def ins = context.httpResponse.getRawResponseBody();
def isImageSaved = false;
InputStream inputStream;
FileOutputStream outputStream;
if (ins){
try {
inputStream = new ByteArrayInputStream(ins);
outputStream = new FileOutputStream(new File(context.expand("C:\\animal.jpg")));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
isImageSaved = true;
}catch (Exception e){
log.error e;
e.printStackTrace();
}finally{
inputStream.close();
outputStream.close();
}
} else {
log.error "image does not exist...";
}
context.testCase.setPropertyValue("isImageSaved", isImageSaved.inspect());
答案 1 :(得分:0)
您需要获取实际的字节数(raw)以避免使用字节数组转换为文本缓冲。
byte[] response = context.httpResponse.getRawResponseBody()
pathname = "C:\\Users\\mdirickx\\Pictures\\soapui\\file_cat_bytesRaw05.jpeg"
FileOutputStream fos = new FileOutputStream(pathname);
fos.write(response);
fos.close();
我努力与某些人相似。最后我把它扔了,因为我没时间。
但有些指示: JFIF网站:https://www.loc.gov/preservation/digital/formats/fdd/fdd000018.shtml
你潜入BASE64,但实际上这不是开始的地方。 base64编码的jpeg将以/9j/4AAQSkZJRgA...
开头。
你没有这样的字符串。您的字符串表示以ÿØÿà JFIF...
开头。当您在HEX编辑器中拖动jpeg文件时,这正是您获得的字符串表示。如果你想尝试它,而你没有HEX编辑器,那么将一个jpeg文件拖到记事本中。您会看到它也以ÿØÿà JFIF
开头。
如果您在服务响应和记事本应用程序中看到图像的字符串表示,您可能会看到一些差异。这可能是因为字符编码。这里的问题的真相是表示可能有缺陷,因为每个字节集都不能用字符表示。
关键是找出如何获取发送的实际字节数组而不是你可以看到的响应,这实际上是一个由SoapUI咀嚼的字节数组,以表示给SoapUI工具的用户。
本论文得到以下实验的支持:
你会发现大量的角色(90,91,80,8D和8F)正在被3F取代。 3F是问号的十六进制表示。换句话说:当你工作的字符集没有表示时,所有未知字符都被转移为问号。
更多信息可在http://www.i18nqa.com/iuc37-Texin-Critical%20values%20for%20i18n%20testing.pdf,幻灯片25上找到。
根据本幻灯片,81,8D,8F,90,9D尚未分配给角色。这些正是我发现在文件字节码的十六进制中用3F替换的值。
如果您可以在将消息转换为文本(RAW响应)之前接受消息,那么就有希望。如果响应首先保存到已经完成'损坏'的SoapUI XML项目文件中,然后检索以进行进一步操作,则无法获得正确的字节,因为它们已被3F的序列替换。
你可以用OP的答案来做到这一点。我缩短了一点因为我只需要写入磁盘部分。如果失败了,我会在报告中看到失败的断言。