标签:java apache-camel
我有一个授权服务器[Simple Class with @SpringBootApplication,
@ RestController,@ Configuration,@ EnableAuthorizationServer& oauth2安全]在端口8081上运行,工作正常&使用POST方法从POSTMAN请求时提供访问令牌以及键值对形式的必要参数,
http:// localhost:8080 / oauth / token,但是如何在java中实现camel路由以通过在body中传递参数来获取访问令牌?
解决方法:
这个问题更多的是关于使用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标头
>授权标头 – 这是端点选项authUsername和authPassword指定的标准HTTP component的一部分
> Content-Type – 这是我的PrepareMultipartFormData处理器中添加的
>表单数据 – 这些数据从PrepareMultipartFormData Processor中的标题转换而来
> grant_type
>用户名
>密码
> client_id
最终路线可以这种方式实施:
(用一些表达式替换常量,动态设置它.如果你只需要响应中的标记,添加一些解组,因为这条路由返回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());
}
标签:java,apache-camel 来源: https://codeday.me/bug/20190701/1347118.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。