从 Camel 中的 multipart/form-data HTTP POST 请求中获取键值对
Get key-value pairs from multipart/form-data HTTP POST request in Camel
我有一个使用 Apache Camel 的端点设置来接收 multipart/form-data 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
。此行为记录在此处
AttachmentMessage
中的键不是来自表单数据请求的原始键,而是文件名(例如 config-file.json
)
有什么方法可以将这个请求解析成映射或类似的结构,以便可以访问所有原始键和值吗?
为了清楚起见,由于上面提出的解决方案似乎可行,所以再多解释一下(虽然它更像是一种变通方法而不是解决方案):
开始于:
Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();
可以浏览所有地图条目,对于每个找到的 Attachment
object,使用 getHeaderNames()
检查附件 headers,以及 [=26] =]一个:
Content-Disposition: form-data; name="data"; filename="data-file.json"
最终可以解析为 name 形式(本例中为 'data')。
不是直截了当,但这显然有效...
我有一个使用 Apache Camel 的端点设置来接收 multipart/form-data 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
。此行为记录在此处 AttachmentMessage
中的键不是来自表单数据请求的原始键,而是文件名(例如config-file.json
)
有什么方法可以将这个请求解析成映射或类似的结构,以便可以访问所有原始键和值吗?
为了清楚起见,由于上面提出的解决方案似乎可行,所以再多解释一下(虽然它更像是一种变通方法而不是解决方案):
开始于:
Map<String, Attachment> attachmentObjects = attachmentMessage.getAttachmentObjects();
可以浏览所有地图条目,对于每个找到的 Attachment
object,使用 getHeaderNames()
检查附件 headers,以及 [=26] =]一个:
Content-Disposition: form-data; name="data"; filename="data-file.json"
最终可以解析为 name 形式(本例中为 'data')。
不是直截了当,但这显然有效...