2016-10-25 14 views
0

私はアンドロイドとRESTクライアントが初めてです。私は、APIと通信するためのアプリケーションを構築するためにレトロフィットを使用しています。Retrofitでは、インターフェイスごとに1つの方法を使用する理由

多くのチュートリアルでは、インターフェイスごとに1つのメソッドを宣言することが推奨されています(多くのメソッドは多くのインターフェイスを意味します)。

例:2つのメソッド、GET、POSTが必要な場合。私は2つのインターフェイスが必要になります。

public interface GetService { 
    @GET("/abc/xyz") 
    Call <ABC> getService(); 
} 

public interface PostService { 
    @POST("/abc/def") 
    Call<XYZ> postServer(@Body XYZ content); 
} 

とmain_activityに私は

//call get 
GetService get = ServiceGenerator.createService(GetService.class); 
ABC call1 = get.getService(); 
//call post 
PostService post = ServiceGenerator.createService(PostService.class); 
XYZ call2 = post.postService(); 

を呼び出す必要がありますが、なぜ私はこのような1つのインターフェイスだけを持つことはできません。

public interface APIInterface { 
@GET("/abc/xyz") 
    Call <ABC> getService(); 

@POST("/abc/def") 
    Call<XYZ> postServer(@Body XYZ content); 
} 

と中をMain_Activity、私は以下を行う必要があります:

APIInterface api = ServiceGenerator.createService(APIInterface.class); 
ABC call1 = api.getService(); 
XYZ call2 = api.postServer(); 
+0

あなたは物事を混同している可能性はありますか?そこにラムダを使うことができるので、たった一つのメソッドで簡単なインターフェースを持つのは良いことです。しかしそれはまだユースケース自体に関係しています。インターフェイスに複数のメソッドを持つことをお勧めしたい場合は、複数のメソッドをそこに配置してください。 – tynn

答えて

2

インターフェイスごとに1つのサービスでこの「良い習慣」に従う必要はありません。 ビジネスパーツごとに1つのインターフェイスを使用する場合は、これで問題ありません。

public interface ProductRestService { 
    @GET("/product/****") 
    Call <Product> getProduct(long id); 

    @PUT("/product/****") 
    Call <Product> update(long id, @Body Product product); 

    @POST("/product/****") 
    Call <Product> create(@Body Product product); 

    @DELETE("/product/****") 
    Call <Void> deleteProduct(long id); 
} 

の目標はただ一つのインタフェースですべてを入れて、すべてのアプリのサービスとのインタフェース

+0

ありがとう!しかし、パフォーマンス面では、できるだけ多くのインターフェイスを使用する方が良いでしょうか? –

+0

インターフェイスごとに1つのサービスを宣言する場合は、createService()を呼び出すことによってサービスごとにレトロフィットを備えたサービスを作成する必要があります。だから私の例のようなビジネスアーキテクチャーよりも高価ですし、読みにくいです。ここでは、4つではなく1つのProductServiceを作成するだけです。私はcreateService()メソッドのコストを測定しませんでしたが、それは全く無視できないと思います。 –

+0

ありがとうございます。しかし、なぜそれを推薦している人がいるのだろうか。 –

0

を避けるためです。どこにでも簡単に呼び出すことができます。ベースURLが異なる場合は、別のインターフェースを使用できます。開発者に依存します

public interface RestApi { 

    @FormUrlEncoded 
    @POST("Token") 
    Observable<TokenResponse> normalLogin(
     @Field("grant_type") String grant_type, 
     @Field("UserName") String UserName, 
     @Field("Password") String Password 
    ); 

    @FormUrlEncoded 
    @POST("Account/VerifyExternalLogin") 
    Observable<ExternalLoginResponse> externalLogin(
      @QueryMap HashMap<String,String> option 
    ); 

    @FormUrlEncoded 
    @POST("Account/ResetPassword") 
    Observable<ResetResponse> requestPassword(
      @Field("Email") String email 
    ); 

    @GET("Profile") 
    Observable<UserDetail> getProfile(); 

    @GET("History/{cartId}") 
    Observable<OrderHistoryResponse> getHistoryDetail(
      @Path("cartId") int cartId 
    ); 
} 
関連する問題