我有一个通过 REST 公开的 Spring Boot 应用程序。
收到请求后,它会用多部分数据响应调用者。请求应用程序迭代多部分数据并打印响应。
正如您在下面的代码中看到的,多部分响应有两种不同的内容类型,
application/json
和vnd.3gpp.5gnas
数据由边界分隔。
我成功读取了
application/json
数据。vnd.3gpp.5gnas
数据时,输出与最初发送的完全不同。vnd.3gpp.5gnas
数据发送的字节数组数据是十六进制字节数组,如下面的代码所示。
有人可以帮忙确定如何正确读取十六进制字节数组吗?
发送多部分字节数组的代码
private byte[] createMultipartContent(String jsonData, String boundary)
throws IOException, DecoderException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
// write JSON part
dataOutputStream.writeBytes("--" + boundary + "\r\n");
//dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"xml\"\r\n");
dataOutputStream.writeBytes("Content-Type: application/json\r\n");
dataOutputStream.writeBytes("\r\n");
dataOutputStream.write(jsonData.getBytes());
dataOutputStream.writeBytes("\r\n");
// write binary part
dataOutputStream.writeBytes("--" + boundary + "\r\n");
//dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"binary\"\r\n");
dataOutputStream.writeBytes("Content-Id: n1msg\r\n");
dataOutputStream.writeBytes("Content-Type: application/vnd.3gpp.5gnas\r\n");
dataOutputStream.writeBytes("\r\n");
dataOutputStream.write(Hex.decodeHex(
"c27b000f80000d040aa8dcef000d040ab100d2"));
dataOutputStream.writeBytes("\r\n");
// write boundary
dataOutputStream.writeBytes("--" + boundary + "--\r\n");
return outputStream.toByteArray();
}
读取多部分数据的代码
public String parseMultipartData(
MimeMultipart mimeMultipart) {
String result = null;
// Iterate over each part in the MimeMultipart object
try {
for (int i = 0; i < mimeMultipart.getCount(); i++) {
BodyPart bodyPart = mimeMultipart.getBodyPart(i);
// Extract content type of this body part
String contentType = bodyPart.getContentType();
if (contentType.equals("application/json")) {
byte[] bytes = IOUtils.toByteArray(
bodyPart.getInputStream());
result = new String(bytes);
} else if (
contentType.equals("vnd.3gpp.5gnas")) {
byte[] bytes = IOUtils.toByteArray(
bodyPart.getInputStream());
result = new String(bytes);
}
}
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}
函数的结构使得无法到达处理
vnd.3gpp.5gnas
部分的部分,因为 return
中的 if
会缩短 for
循环。
除此之外,您在
createMultipartContent
中写入的是二进制数据,但在函数中您尝试将其读取为String
。如果您想查看与您编写的相同的十六进制表示形式,则需要将 new String(bytes)
更改为 Hex.encodeHex(bytes)
可能是这样的:
public String[] parseMultipartData(
MimeMultipart mimeMultipart) {
String result[] = new String[mimeMultipart.getCount()];
// Iterate over each part in the MimeMultipart object
try {
for (int i = 0; i < mimeMultipart.getCount(); i++) {
BodyPart bodyPart = mimeMultipart.getBodyPart(i);
// Extract content type of this body part
String contentType = bodyPart.getContentType();
if (contentType.equals("application/json")) {
byte[] bytes = IOUtils.toByteArray(
bodyPart.getInputStream());
result[i] = new String(bytes);
} else if (
contentType.equals("vnd.3gpp.5gnas")) {
byte[] bytes = IOUtils.toByteArray(
bodyPart.getInputStream());
result[i] = Hex.encodeHex(bytes);
}
}
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}