Scala MultipartEntityBuilder 没有为 Spring 休息点正确创建边界

Scala MultipartEntityBuilder is not creating the boundary correctly for a Spring Rest point

我有一个请求 body,它由多个 body 部分组成,下面是我如何使用 Scala 中的 multipartentitybuilder 库在 Scala 中处理它。

val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addPart("actual Header", new StringBody(actualHeader,ContentType.APPLICATION_JSON)) .addBinaryBody("payload", requestBody) .build()

对于上下文,二进制 body 是需要发送到此 post 请求的 avro 事件的 Byte[]。

在尝试通过 httpPost 将此实体发送到 spring 休息端点时,我收到以下异常响应。

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

我试过的:

val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addPart("Event Header", new StringBody(eventHeader,ContentType.APPLICATION_JSON)) .addPart("payload",new ByteArrayBody(requestBody, ContentType.DEFAULT_BINARY, null.asInstanceOf[String])) .build()

val data = MultipartEntityBuilder.create() .setBoundary(boundary) .addTextBody("Event Header",eventHeader,ContentType.APPLICATION_JSON) .addBinaryBody("Payload",requestBody,ContentType.DEFAULT_BINARY,null.asInstanceOf[String]) .build()

这让我更进一步,因为它自动检测到 ContentType 为 multipart/form-data,但是当我将 Entity 设置为 post 时,它没有将该信息传输到 POST 并且仍然没有' 将边界正确分配为 header

中内容类型的一部分

val file = new File("eventHeader.json") val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("Event Header",file,ContentType.APPLICATION_JSON,"eventHeader.json") .addBinaryBody("Avro Payload",requestBody) .build()

运气不好

有关更多上下文和信息,下面是 POST 请求

的其他属性
val post = new HttpPost(url);
val client: CloseableHttpClient = HttpClientBuilder.create().build();
post.setConfig(requestConfig)
post.setHeader("Content-type", "multipart/form-data")
post.setEntity(data)

val response: HttpResponse = client.execute(post)

另一条信息,当我在 IntelliJ 中调试实体时,它向我显示了一个已创建的边界,但我在内容的任何物理位置都看不到它。(不确定此信息有多大帮助)

现在,异常引用了 spring 框架,我一直怀疑 scala 不能很好地处理它。但是,我们已经在 scala 中成功地实现了 gatling 测试场景,因此并非完全不可能实现。

因此,我现在向社区的专业知识交代如何解决这个问题而不会过于侵入,因为这将成为 spark 服务的一部分,所以我们不要忽视它的数据分发方面。

我终于通过简单地从最初生成的数据的内容类型添加边界来让它工作。

下面是我如何更改代码以使请求通过,

val file = new File("testHeader.json")

   val data = MultipartEntityBuilder.create()
  .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
  .addBinaryBody("Event Header",file,ContentType.APPLICATION_JSON,"testHeader.json")
  .addBinaryBody("Avro Payload",requestBody)
  .build()
val client: CloseableHttpClient = HttpClientBuilder.create().build();

val APIUrl = url

val post = new HttpPost(APIUrl);
post.setConfig(requestConfig)
post.setHeader(data.getContentType)
post.setEntity(data)

简单的解决方案但有点变通,出于某种原因(我不知道)当我根本没有设置内容类型时它没有自动检测类型。希望这能在将来的某个时候帮助像我这样的可怜人。