更好的方法来处理常见的标头和root?

时间:2016-09-06 07:59:57

标签: android-annotations

有没有更好的方法来设置像全局配置一样的承载,而不是每次都像这样设置:

restClient.setBearerAuth(TokenStore.getInstance().getLocalToken());              

根网址相同,是否有全局配置,而不是像这样设置:

String root= Application.getInstance().getApplicationContext().getResources().getString(R.string.whiteLabelApiBaseHost)
restClient.setRootUrl(root);            

在改造中,有类似的东西:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Application.getInstance().getApplicationContext()
                            .getResources().getString(R.string.whiteLabelApiBaseHost))

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

要设置根URL,您可以使用此方法,用常量

替换字符串
@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJackson2HttpMessageConverter.class }, interceptors = MyAuthInterceptor.class)
public interface MyRestClient {
    @Get("/events")
    EventList getEvents();
}

请注意,我们在@Rest注释的参数中设置了一个拦截器。 所以创建一个这样的类:

@EBean(scope = Scope.Singleton)
public class MyAuthInterceptor implements ClientHttpRequestInterceptor {

@Bean
MyAuthStore authStore;

public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    HttpHeaders headers = request.getHeaders();
    HttpAuthentication auth = new HttpBasicAuthentication(authStore.getUsername(), authStore.getPassword());
    headers.setAuthorization(auth);
    return execution.execute(request, body);
    }
}

现在在执行请求之前调用MyAuthInterceptor.intercept(),您可以根据需要设置身份验证数据

在你的main build.gradle文件中,你可以在android元素中添加

productFlavors {

    development {
        buildConfigField "String", "SERVICE_URL_BASE", "\"dev.xxx.com/rest\""
    }

    test {
        buildConfigField "String", "SERVICE_URL_BASE", "\"test.xxx.com/rest\""
    }

    production {
        buildConfigField "String", "SERVICE_URL_BASE", "\"production.xxx.com/rest\""
    }
}

然后在@Rest注释中,您可以使用此代码获取当前的风味值:

@Rest(rootUrl = "https://" + BuildConfig.SERVICE_URL_BASE)

现在,您可以选择要使用的构建变体(variant = flavor + buildType)来使用所需的值。要选择变体,您可以使用相应的视图,它应该出现在android studio的左侧。

此技术有助于避免仅使用不同的变量来创建flavor包树