1

我有一个 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(或任何其他方式)来获得与之前的工作代码相同的多部分请求?

4

0 回答 0