【问题标题】:Get key-value pairs from multipart/form-data HTTP POST request in Camel从 Camel 中的 multipart/form-data HTTP POST 请求中获取键值对
【发布时间】:2022-01-24 16:02:13
【问题描述】:

我有一个使用 Apache Camel 来接收多部分/表单数据 HTTP 请求的端点设置。本质上,我正在尝试提交一个数据文件和一个配置文件进行处理。请求如下(由 Postman 生成):

POST /upload HTTP/1.1
Host: localhost:8900
Content-Length: 363
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="data"; filename="data-file.json"
Content-Type: application/json

(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="config"; filename="config-file.json"
Content-Type: application/json

(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW

我的路线是这样设置的:

@Component
public class FileReceiverRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        rest()
                .post("/upload")
                .consumes(MediaType.MULTIPART_FORM_DATA_VALUE)
                .bindingMode(RestBindingMode.off)
                .route().routeId("upload-route")
                .unmarshal().mimeMultipart()
                .setHeader(Exchange.FILE_NAME, () -> UUID.randomUUID().toString())
                .to("file:{{temp.input.files.dir}}")
                .process(configFileProcessor)
                // on to further processing
    }
}

还有我的配置文件处理器:

@Component
public class ConfigFileProcessor implements Processor {

    @Override
    public void process(Exchange exchange) throws Exception {
        Message message = exchange.getIn();
        AttachmentMessage attachmentMessage = exchange.getMessage(AttachmentMessage.class);
        Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();

        // this fails - the key is instead the file name "config-file.json"
        Attachment configAttachment = attachmentObjects.get("config");
    }
}

我希望能够从表单数据中检索键值对并相应地处理数据和配置文件。相反,我得到以下行为:

  • 表单中的第一个值(在本例中为 data-file.json)被解析为 Camel 消息体,并且密钥似乎被丢弃了。其余条目被解析为AttachmentMessage。此行为记录在此处https://stackoverflow.com/a/67566273/11248602
  • AttachmentMessage 中的键不是来自表单数据请求的原始键,而是文件名(例如 config-file.json

有没有办法把这个请求解析成一个map或者类似的结构,这样所有的原始key和value都可以被访问到?

【问题讨论】:

  • 如果你浏览 attachmenttObjects 地图,检查每个条目的标题(使用 Attachment#getHeaderNames()),希望找到“Content-Disposition”(包括真实姓名) ?
  • @TacheDeChoco 谢谢,是的,确实可以获取密钥:) 随意创建一个答案,我会接受。不能解决解析到消息正文中的第一个条目,但我可以忍受

标签: java http apache-camel multipartform-data


【解决方案1】:

为了清楚起见,由于上面提出的解决方案似乎可行,因此需要更多解释(尽管它更像是一种解决方法而不是解决方案):

起点:

Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();

可以浏览所有映射条目,对于找到的每个 Attachment 对象,使用 getHeaderNames() 检查附件标题,以及其他“内容处置”之一:

Content-Disposition: form-data; name="data"; filename="data-file.json"

最终可以解析为 name 形式(本例中为“数据”)。

不直截了当,但这显然有效......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多