如何在Azure SDK 2.8.0及以上通过ResourceManager获取OkHttpClient和RestClient
Azure Java SDK 2.8.0+ ResourceManager 获取OkHttpClient与RestClient 迁移方案
核心变动说明
2.8.0及以上版本的Azure Java SDK重构了ResourceManager的继承结构,移除了旧版ServiceClient父类中公开的httpClient()、restClient()方法,旧版RestClient类的能力已整合到新的HttpPipeline组件中。
迁移方案
场景1:构建ResourceManager阶段自定义/持有HTTP客户端
推荐在实例化ResourceManager时就自定义并持有所需的HTTP客户端实例,无需后续从ResourceManager中反向获取:
// 引入azure-core-http-okhttp依赖后,可直接构造OkHttp实现的HttpClient HttpClient okHttpClient = new OkHttpAsyncHttpClientBuilder() .connectTimeout(Duration.ofSeconds(30)) .addInterceptor(yourCustomInterceptor) .build(); // 用自定义的HttpClient构造ResourceManager ResourceManager resourceManager = ResourceManager.configure() .withHttpClient(okHttpClient) .authenticate(azureCredentials) .withDefaultSubscription(); // 直接持有okHttpClient实例即可使用
场景2:从已实例化的ResourceManager中获取底层组件
如果需要从已创建好的ResourceManager实例中提取底层HTTP客户端和请求处理组件,可通过反射方式获取:
// 1. 反射获取内部的serviceClient实例 Field serviceClientField = ResourceManager.class.getDeclaredField("serviceClient"); serviceClientField.setAccessible(true); AzureResourceManager innerServiceClient = (AzureResourceManager) serviceClientField.get(resourceManager); // 2. 获取HttpPipeline(对应旧版RestClient的核心能力) HttpPipeline pipeline = innerServiceClient.httpPipeline(); // 可从pipeline中获取认证、序列化、自定义拦截器等所有RestClient相关能力 // 3. 获取底层HttpClient实例 HttpClient httpClient = pipeline.httpClient(); // 若使用的是OkHttp实现,可强制转换为OkHttpAsyncHttpClient,再取出原生OkHttpClient if (httpClient instanceof OkHttpAsyncHttpClient) { OkHttpClient nativeOkHttpClient = ((OkHttpAsyncHttpClient) httpClient).getOkHttpClient(); }
注意:反射方式依赖SDK内部实现,不同小版本可能存在字段名变动,生产环境优先使用场景1的方案。
旧版RestClient替代说明
旧版RestClient的请求发送、序列化、拦截器编排能力已全部整合到HttpPipeline中,直接使用HttpPipeline即可实现所有原RestClient的功能。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

