Scala MultipartEntityBuilder没有为Spring Rest Point正确创建边界

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

我有一个包含多个主体部分的请求主体,下面是我如何使用scala中的multipartentitybuilder库在scala中处理它。

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

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

关于尝试通过httpPost将此实体发送到spring rest端点,我得到以下异常响应。

org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常是java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:由于未找到多部分边界,请求被拒绝

我尝试过的:

  • 我尝试使用.setBoundary()手动添加边界,但这没有帮助。
  • 还有另一种进入其他在线解决方案的方法。我可以摆脱标有ContentType.Application-JSON的标头,但是在API级别删除标头会失败,因为它们已经对其进行了检查,因此也无法使用。
  • 我尝试添加二进制主体作为使其一致的一部分,从而使代码看起来像这样

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创建文本主体(用于JSON部分)和有效载荷部分的字节数组,并使用以下代码摆脱了内容类型]

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,并且仍然没有正确地将边界分配为内容类型的一部分。标头

  • 还尝试从文件中添加标头,以确保两个主体在本质上与以下代码一致

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中调试实体时,它向我显示了创建的边界,但在内容上的任何位置我都看不到它。(不确定此信息有多有用)

现在,例外是指springframework,我有点怀疑scala不能很好地发挥作用。但是,我们已经在scala中成功实现了加特林测试场景,因此并非不可能完全实现。

因此,我现在向社区的专家们介绍如何在不过于侵入的情况下解决此问题,因为这将成为Spark服务的一部分,因此,我们不要忽略这一切的数据分发方面。

spring scala post httpclient multipartform-data
1个回答
0
投票

我终于让它与原始生成的数据的内容类型简单地加上了边界。

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

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.