我有一个包含多个主体部分的请求主体,下面是我如何使用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:由于未找到多部分边界,请求被拒绝
我尝试过的:
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,并且仍然没有正确地将边界分配为内容类型的一部分。标头
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服务的一部分,因此,我们不要忽略这一切的数据分发方面。
我终于让它与原始生成的数据的内容类型简单地加上了边界。
下面是我如何更改代码以通过请求,
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)
简单的解决方案,但是可以解决,由于某种原因(我不知道),当我根本没有设置内容类型时,它不会自动检测类型。希望这可以在将来的某个时候帮助另一个像我这样的穷人。