处理 common headers 和 root 的更好方法?
Better way to handle common headers and root?
有没有更好的方法来像全局配置一样设置承载而不是每次都这样设置:
restClient.setBearerAuth(TokenStore.getInstance().getLocalToken());
root 也一样url,有没有全局配置而不是这样设置:
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))
有什么想法吗?
要设置根 url 你可以使用这个方法,用常量替换字符串
@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJackson2HttpMessageConverter.class }, interceptors = MyAuthInterceptor.class)
public interface MyRestClient {
@Get("/events")
EventList getEvents();
}
请注意,我们在@Rest 注释的参数中设置了一个拦截器。
所以像这样创建一个 class:
@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(),您可以根据需要设置身份验证数据
在您的 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)
现在您可以 select 使用什么构建变体 (variant = flavor + buildType) 来使用所需的值。对于 select 变体,您可以使用相应的视图,它应该出现在 android studio 的左侧。
此技术有助于避免创建 flavor 的包树只是为了使用不同的变量
有没有更好的方法来像全局配置一样设置承载而不是每次都这样设置:
restClient.setBearerAuth(TokenStore.getInstance().getLocalToken());
root 也一样url,有没有全局配置而不是这样设置:
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))
有什么想法吗?
要设置根 url 你可以使用这个方法,用常量替换字符串
@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJackson2HttpMessageConverter.class }, interceptors = MyAuthInterceptor.class)
public interface MyRestClient {
@Get("/events")
EventList getEvents();
}
请注意,我们在@Rest 注释的参数中设置了一个拦截器。 所以像这样创建一个 class:
@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(),您可以根据需要设置身份验证数据
在您的 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)
现在您可以 select 使用什么构建变体 (variant = flavor + buildType) 来使用所需的值。对于 select 变体,您可以使用相应的视图,它应该出现在 android studio 的左侧。
此技术有助于避免创建 flavor 的包树只是为了使用不同的变量