我有一个 Spring Boot 应用程序,它使用 Camel 将 multipart/form-data 请求发布到 REST 端点。该请求包括文本部分和文件部分。构建请求的代码如下:
@Override
public void process(Exchange exchange) throws Exception {
@SuppressWarnings("unchecked")
Map<String, String> body = exchange.getIn().getBody(Map.class);
String fileName = body.get("FILE_NAME");
String filePath = body.get("FILE_PATH");
MultipartEntityBuilder entity = MultipartEntityBuilder.create();
entity.addTextBody("name", fileName, ContentType.DEFAULT_TEXT);
entity.addBinaryBody("file", new File(filePath),
ContentType.APPLICATION_OCTET_STREAM, fileName);
exchange.getIn().setBody(entity.build());
}
.to("https4://<endpoint>")
这段代码运行良好。在我的 pom.xml 文件中,我正在导入 camel-http4 组件:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http4</artifactId>
<version>${camel.version}</version>
</dependency>
正如最新的 Camel 文档https://camel.apache.org/components/latest/http-component.html所建议的那样,我已尝试用 camel-http-starter 替换 camel-http4 组件
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http-starter</artifactId>
<version>${camel.version}</version>
</dependency>
并用 http 替换所有 http4 端点,但是上面的代码现在失败了,因为在 camel-http 组件中的 HttpEntity 和 InputStream 之间没有可用的类型转换器。
我尝试过使用 Camel 的 MIME Multipart DataFormat:
.setHeader("name", simple("${body[FILE_NAME]}"))
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
@SuppressWarnings("unchecked")
Map<String, String> body = exchange.getIn().getBody(Map.class);
String filePath = body.get("FILE_PATH");
exchange.getIn().setBody(new File(filePath));
}
})
// Add only "name" header in multipart request
.marshal().mimeMultipart("form-data", true, true, "(name)", true)
.to("https://<endpoint>")
但我不断从服务器收到 HTTP 400 错误,这意味着它不理解请求。所以我的问题是:如何使用 MIME Multipart DataFormat(或任何其他方式)来获得与之前的工作代码相同的多部分请求?