这个问题更多的是关于使用 Apache Camel 发送multipart/form-data。前段时间我在玩它,并使用自定义处理器解决了它,使用Content-Disposition: form-data 将标头转换为multipart/form-data 格式。
这是我的处理器将标头转换为multipart/form-data 格式:
public class PrepareMultipartFormData implements Processor {
private String[] multipartHeaders;
public PrepareMultipartFormData(String... multipartHeaders) {
this.multipartHeaders = multipartHeaders;
}
@Override
public void process(Exchange exchange) throws Exception {
addMultipart(exchange.getIn(), multipartHeaders);
}
private static void addMultipart(Message message, String... multipartKeys){
final String boundary = "---------------------------"+RandomStringUtils.randomAlphanumeric(9);
message.setHeader(Exchange.CONTENT_TYPE, "multipart/form-data;boundary="+boundary);
StringBuilder sb = new StringBuilder("--").append(boundary);
for (String key: multipartKeys) {
sb.append("\r\n")
.append("Content-Disposition: form-data; name=\"").append(key).append("\"")
.append("\r\n\r\n")
.append(message.getHeader(key, String.class))
.append("\r\n")
.append("--").append(boundary);
}
message.setBody(sb.toString());
}
}
您需要发送到 OAuth 请求令牌:
-
HTTP 标头
- 授权标头 - 这是标准HTTP component 的一部分,由端点选项
authUsername 和authPassword 指定
- Content-Type - 这是在我的
PrepareMultipartFormData 处理器中添加的
-
表单数据 - 这些是从
PrepareMultipartFormData 处理器中的标题转换而来的
- grant_type
- 用户名
- 密码
- client_id
最终路由可以这样实现:
(用一些表达式替换常量,动态设置它。如果你只需要token作为响应,添加一些解组,因为这个路由返回JSON)
from("direct:getTokenResponse")
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.HTTP_PATH, constant("oauth/token"))
.setHeader("grant_type", constant("password"))
.setHeader("username", constant("admin"))
.setHeader("password", constant("admin1234"))
.setHeader("client_id", constant("spring-security-oauth2-read-write-client"))
.process(new PrepareMultipartFormData("grant_type", "username", "password", "client_id"))
.to("http://localhost:8080?authMethod=Basic&authUsername=oauth-endpoint-username&authPassword=oauth-endpoint-password")
.convertBodyTo(String.class)
.to("log:response");
更新答案以使用MultipartEntityBuilder 提供更短的PrepareMultipartFormData#addMultipart 实现。
private static void addMultipart(Message message, String... multipartKeys) throws Exception{
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
for (String key: multipartKeys) {
builder.addTextBody(key, message.getHeader(key, String.class));
}
HttpEntity resultEntity = builder.build();
message.setHeader(Exchange.CONTENT_TYPE, resultEntity.getContentType().getValue());
message.setBody(resultEntity.getContent());
}