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
我试过的:
- 我尝试使用 .setBoundary() 手动添加边界,但这没有帮助。
- 还有另一种方法可以访问在线提供的其他解决方案。我可以去掉表示 ContentType.Application-JSON 的 header,但是删除它会在 API 级别失败,因为他们已经检查了它,所以不会要么工作。
- 我尝试添加二进制 body 作为一部分以使其保持一致,这使得代码看起来像这样
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()
- 试图让 multipartEntityBuilder 创建文本body(对于 JSON 部分)
和 bytearray 用于有效负载部分并使用以下代码删除内容类型
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
中内容类型的一部分
- 还尝试从文件中添加 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)
简单的解决方案但有点变通,出于某种原因(我不知道)当我根本没有设置内容类型时它没有自动检测类型。希望这能在将来的某个时候帮助像我这样的可怜人。
我有一个请求 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
我试过的:
- 我尝试使用 .setBoundary() 手动添加边界,但这没有帮助。
- 还有另一种方法可以访问在线提供的其他解决方案。我可以去掉表示 ContentType.Application-JSON 的 header,但是删除它会在 API 级别失败,因为他们已经检查了它,所以不会要么工作。
- 我尝试添加二进制 body 作为一部分以使其保持一致,这使得代码看起来像这样
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()
- 试图让 multipartEntityBuilder 创建文本body(对于 JSON 部分) 和 bytearray 用于有效负载部分并使用以下代码删除内容类型
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
- 还尝试从文件中添加 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)
简单的解决方案但有点变通,出于某种原因(我不知道)当我根本没有设置内容类型时它没有自动检测类型。希望这能在将来的某个时候帮助像我这样的可怜人。