无法读取内容类型 vnd.3gpp.5gnas 的多部分数据

问题描述 投票:0回答:1

我有一个通过 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;
}
java multipart
1个回答
0
投票

函数的结构使得无法到达处理

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.