2017-07-10 8 views
9

Camelは統合のためにRESTサービスを呼び出す必要がありますが、RESTサービスはトークンを取得するために最初に呼び出される必要がある認証api(POST API)後続のapi呼び出しは、HTTP要求のヘッダーに埋め込まれたトークンで呼び出されなければなりません。Camelとの認証サービスを必要とするRESTサービスコール

Spring Restemplateまたはapache camelには同じものをサポートするいくつかのAPIがありますか?

+5

この使用例ではApache Camelを使用しました。効果的には、結果的に2つのサービスを呼び出す必要があります。私は、認可ヘッダ(私はレポへのアクセス権がもうありません)にキャッシュされたまたは新しいアクセストークン(およびキャッシュ)を返すルートを作成し、メインルートで濃縮呼び出しを使用しました。 – gusto2

+0

CamelにはFluentProducerTemplate/ProducerTemplate APIがあり、これはSpring xxxTemplateと似ていますが、すべてのCamelコンポーネント/エンドポイントで使用できます。 –

+0

@ gusto2あなたのアプローチに従ってください。作業中の解決策を、他の人が(必要であれば)使用するための答えとして追加しました。 – sakura

答えて

4

続きを読む@ 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()を持ってRestTokenProducerRoutetokenObj豆(インスタンスから消費なっている。これは、保存されたトークンを返します。

言うまでもなく、あなたはcamelcontextでBeanを設定していますレジストリ(コンポーネントのような、ルートなど)他の設定と一緒に次のように。次のように私の場合はそれがあった。

​​

これは、トークンは、pを取得しているところトークン動的に設定するの私の問題を解決他のルートを実行した結果として発生します。

+0

コードは、各サーバー要求の新しいトークンを要求しています。それは大丈夫かもしれませんが、ベストプラクティス(と私の将来の提案)はキャッシュ(http://camel.apache.org/cache.html)し、トークンを再利用することです(または、永続的なアプリケーションレベルのトークン他の外部サービスにあなたのサービスの不必要な負荷をかけることはありません。それに関係なく、 - お寄せいただきありがとうございます:) – gusto2

+0

@ gusto2は、各サーバーのリクエストに対して、新しいトークンをリクエストしていません。トークンは、TokenProducer Routeで設定された20分ごとにリフレッシュされます。したがって、20分ごとにルートが呼び出され、インメモリーBean(tokenObj)にトークンをキャッシュ/ストアします。また、他のサーバー要求は、いつ更新されるのかを知らずにtokenObjからトークンにアクセスするだけです。したがって、間違いなく、各サーバー要求に対して新しいトークンを要求していません。 – sakura

関連する問題