web-dev-qa-db-ja.com

RestクライアントAPIの設計と実装(RestEasyを使用)

複数のサービス(異なる外部システム)との現在および将来の統合のために、アプリケーションの汎用RESTクライアントを作成する設計に取り組んでいます。以下は高レベルの図です

High level design

外部ホストごとにRestClientを作成し、サービス名をキー、RestClientを値としてマップに格納することを考えています。以下は、ResteasyWebTargetをラップするRestClient(キャッシュされる)クラスです。

public class RestClient {
    private ResteasyWebTarget target;

    @Singleton
    public class RestClientRepository {
        private final Map<String, RestClient> repository = 
            new ConcurrentHashMap<String, RestClient>() 

デフォルトの実装ではRestEasyを使用します。私のクライアントコードは、webapp(マルチスレッド環境)の一部になるため。 PoolingClientConnectionManagerを使用します

ClientConnectionManager cm = new PoolingClientConnectionManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
ResteasyClient client = ((ResteasyClientBuilder) ResteasyClientBuilder
  .newBuilder()).httpEngine(engine).build();

このアプローチよりも良い解決策はありますか?

2
bornleo

そもそもそれは正しいようですが、これらの実装の詳細を隠したいと思います。自問してみてください:ローカルデータベースと一部のリモートデータサーバーの違いは何ですか?

Userのような各リソースとUserStoreのようなストアにされたいと思うでしょう。各ストアには、次のような相互作用のためのいくつかのメソッドがあります。

public User getUser(String, String)
public User getUserById(long)
public void updateUser(User) throws ...
public void deleteUser(User)
public void createUser(User)

これにより、REST APIの実装の詳細が非表示になります。ローカルでのキャッシュの詳細など(ローカルでキャッシュしたい場合は、データを同期する必要があり、同期を正しく行うことは非常に困難です) !)

2
Obenland