Camelは統合のためにRESTサービスを呼び出す必要がありますが、RESTサービスはトークンを取得するために最初に呼び出される必要がある認証api(POST API)後続のapi呼び出しは、HTTP要求のヘッダーに埋め込まれたトークンで呼び出されなければなりません。Camelとの認証サービスを必要とするRESTサービスコール
Spring Restemplateまたはapache camelには同じものをサポートするいくつかのAPIがありますか?
Camelは統合のためにRESTサービスを呼び出す必要がありますが、RESTサービスはトークンを取得するために最初に呼び出される必要がある認証api(POST API)後続のapi呼び出しは、HTTP要求のヘッダーに埋め込まれたトークンで呼び出されなければなりません。Camelとの認証サービスを必要とするRESTサービスコール
Spring Restemplateまたはapache camelには同じものをサポートするいくつかのAPIがありますか?
続きを読む@ gusto2アプローチは、かなりうまく動作します。
私は、以下のような2つのルートを作成しました。最初のものは以下のようなタイマーです。トークンを生成し、定期的にリフレッシュします(ルートはタイマーベースなので)。いくつかの他のルート。
@Component
public class RestTokenProducerRoute extends RouteBuilder {
private String refreshedToken;
@Override
public void configure() throws Exception {
restConfiguration().producerComponent("http4");
from("timer://test?period=1200000") //called every 20 mins
.process(
exchange -> exchange.getIn().setBody(
new UserKeyRequest("apiuser", "password")))
.marshal(userKeyRequestJacksonFormat) //convert it to JSON
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("http4://localhost:8085/Service/Token")
.unmarshal(userKeyResponseJacksonFormat)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
UserKeyResponse response= exchange.getIn().getBody(
UserKeyResponse.class); //get the response object
System.out.println(response + "========>>>>>>" +
response.getResult());
setRefreshedToken(response.getResult()); //store the token in some object
}
}).log("${body}");
}
public String getRefreshedToken() {
return refreshedToken;
}
public void setRefreshedToken(String refreshedToken) {
this.refreshedToken = refreshedToken;
}
}
そして、第2の経路は、第一の経路によって生成されたトークンを使用します、後続のAPIを呼び出すことができますが、それはこのようなものになるだろう。トークンが有効でないか期限切れになっているエラー処理シナリオを追加する必要があります。しかし、それは解決するための別の懸念であると思います。
@Component
public class RestTokenUserOnboardRoute extends RouteBuilder {
private JacksonDataFormat OtherDomainUserRequestJacksonFormat = new JacksonDataFormat(
OtherDomainUserRequest.class);
private JacksonDataFormat OtherDomainUserResponseJacksonFormat = new JacksonDataFormat(
OtherDomainUserResponse.class);
@Override
public void configure() throws Exception {
restConfiguration().producerComponent("http4");
//This route is subscribed to a Salesforce topic, which gets invoked when there is any new messages in the topic.
from("salesforce:CamelTestTopic?sObjectName=MyUser__c&sObjectClass="+MyUser__c.class.getName()))
.convertBodyTo(OtherDomainUserRequest.class)
.marshal(OtherDomainUserRequestJacksonFormat).log("${body}")
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.log("The token being passed is ==> ${bean:tokenObj?method=getRefreshedToken}")
.setHeader("Authorization", simple("${bean:tokenObj?method=getRefreshedToken}"))
.to("http4://localhost:8085/Service/DomainUser")
.unmarshal(OtherDomainUserResponseJacksonFormat)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
OtherDomainUserResponse response = exchange.getIn().getBody(
OtherDomainUserResponse.class);
System.out.println(response + "==================>>>>>> " + response.getStatusCode());
}
}).log("${body}");
}
}
だから、ここトークンが定義されたメソッドgetRefreshedToken()
を持ってRestTokenProducerRoute
のtokenObj
豆(インスタンスから消費なっている。これは、保存されたトークンを返します。
言うまでもなく、あなたはcamelcontextでBeanを設定していますレジストリ(コンポーネントのような、ルートなど)他の設定と一緒に次のように。次のように私の場合はそれがあった。
これは、トークンは、pを取得しているところトークン動的に設定するの私の問題を解決他のルートを実行した結果として発生します。
コードは、各サーバー要求の新しいトークンを要求しています。それは大丈夫かもしれませんが、ベストプラクティス(と私の将来の提案)はキャッシュ(http://camel.apache.org/cache.html)し、トークンを再利用することです(または、永続的なアプリケーションレベルのトークン他の外部サービスにあなたのサービスの不必要な負荷をかけることはありません。それに関係なく、 - お寄せいただきありがとうございます:) – gusto2
@ gusto2は、各サーバーのリクエストに対して、新しいトークンをリクエストしていません。トークンは、TokenProducer Routeで設定された20分ごとにリフレッシュされます。したがって、20分ごとにルートが呼び出され、インメモリーBean(tokenObj)にトークンをキャッシュ/ストアします。また、他のサーバー要求は、いつ更新されるのかを知らずにtokenObjからトークンにアクセスするだけです。したがって、間違いなく、各サーバー要求に対して新しいトークンを要求していません。 – sakura
この使用例ではApache Camelを使用しました。効果的には、結果的に2つのサービスを呼び出す必要があります。私は、認可ヘッダ(私はレポへのアクセス権がもうありません)にキャッシュされたまたは新しいアクセストークン(およびキャッシュ)を返すルートを作成し、メインルートで濃縮呼び出しを使用しました。 – gusto2
CamelにはFluentProducerTemplate/ProducerTemplate APIがあり、これはSpring xxxTemplateと似ていますが、すべてのCamelコンポーネント/エンドポイントで使用できます。 –
@ gusto2あなたのアプローチに従ってください。作業中の解決策を、他の人が(必要であれば)使用するための答えとして追加しました。 – sakura