Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何使用Retrofit解决多个API端点?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的 Android项目中,我使用以下 Retrofit ApiModule作为一个API端点.请注意,我使用 Dagger注入依赖项.
@module(
        complete = false,library = true
)
public final class ApiModule {

    public static final @R_675_10495@ng PRODUCTS_BASE_URL = "https://products.com";

    @Provides
    @Singleton
    Endpoint provideEndpoint() {
        return Endpoints.newFixedEndpoint(PRODUCTS_BASE_URL);
    }

    @Provides
    @Singleton
    ObjectMapper provideObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERscoreS);
        return objectMapper;
    }

    @Provides
    @Singleton
    RestAdapter provideRestAdapter(
        Endpoint endpoint,ObjectMapper objectMapper) {
        return new RestAdapter.builder()
                .setLogLevel(RestAdapter.LogLevel.NONE)
                .setEndpoint(endpoint)
                .setConverter(new JacksonConverter(objectMapper))
                .build();
    }

    @Provides
    @Singleton
    Productsservice provideProductsservice(RestAdapter restAdapter) {
        return restAdapter.create(Productsservice.class);
    }

}

现在,我想与之沟通另一个API(例如“http://subsidiaries.com”).是否可以在重用ObjectMapper和RestAdapter时扩展给定的ApiModule?或者我不应该延长它?我已经尝试复制模块了.但这涉及到我必须复制Endpoint,ObjectMapper和…… RestAdapter有一个私有的构造函数 – 所以我不能.

@H_616_7@解决方法
我猜你可以使用Named Annotations:
@module(
        complete = false,library = true
)
public final class ApiModule {

    public static final @R_675_10495@ng PRODUCTS_BASE_URL = "https://products.com";
    public static final @R_675_10495@ng SUBSIDIARIES_BASE_URL = "https://subsidiaries.com";

    public static final @R_675_10495@ng PRODUCTS = "products";
    public static final @R_675_10495@ng SUBSIDIARIES = "subsidiaries";

    @Provides
    @Singleton
    @Named(PRODUCTS)
    Endpoint provideProductsEndpoint() {
        return Endpoints.newFixedEndpoint(PRODUCTS_BASE_URL);
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    Endpoint provideSubsidiariesEndpoint() {
        return Endpoints.newFixedEndpoint(SUBSIDIARIES_BASE_URL);
    }

    @Provides
    @Singleton
    ObjectMapper provideObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERscoreS);
        return objectMapper;
    }

    @Provides
    @Singleton
    @Named(PRODUCTS)
    RestAdapter provideProductsRestAdapter(@Named(PRODUCTS) Endpoint endpoint,ObjectMapper objectMapper) {
        return newRestAdapterBuilder(objectMapper)
                .setEndpoint(endpoint)
                .build();
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    RestAdapter provideSubsidiariesRestAdapter(@Named(SUBSIDIARIES) Endpoint endpoint,ObjectMapper objectMapper) {
        return newRestAdapterBuilder(objectMapper)
                .setEndpoint(endpoint)
                .build();
    }

    @Provides
    @Singleton
    @Named(PRODUCTS)
    Productsservice provideProductsservice(@Named(PRODUCTS) RestAdapter restAdapter) {
        return restAdapter.create(Productsservice.class);
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    Productsservice provideSubsidiariesservice(@Named(SUBSIDIARIES) RestAdapter restAdapter) {
        return restAdapter.create(Productsservice.class);
    }

    private RestAdapter.builder newRestAdapterBuilder(ObjectMapper objectMapper) {
        return new RestAdapter.builder()
                       .setLogLevel(RestAdapter.LogLevel.NONE)
                       .setConverter(new JacksonConverter(objectMapper));
    }
}

现在,在您注入Productsservice的任何地方,您都需要使用@Named(PRODUCTS)或@Named(SUBSIDIARIES)注释依赖项,具体取决于您需要的变体.当然,除了@Named注释,您还可以创建自己的@L_262_10@注释并使用它们.请参阅“限定符”下的here.

要稍微展平模块,可以将RestAdapter的创建移动到provide * service()方法中,并取消提供* RestAdapter()方法.当然,除非你需要RestAdapters作为模块之外的依赖项.

大佬总结

以上是大佬教程为你收集整理的android – 如何使用Retrofit解决多个API端点?全部内容,希望文章能够帮你解决android – 如何使用Retrofit解决多个API端点?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。