先引入依赖
dependencies {implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 使用 Gson 转换器implementation 'com.squareup.okhttp3:okhttp:4.10.0'implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0' // 用于日志拦截器
}
1、创建 Retrofit链接实例
package com.dc.pub.apiHolder;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.OkHttpClient;
import org.springframework.stereotype.Component;
import retrofit2.Retrofit; // 注意:这里应该是 retrofit2.Retrofit 的一个引用,但通常我们使用 Retrofit.Builder
import retrofit2.converter.jackson.JacksonConverterFactory; import java.net.Proxy;
import java.util.concurrent.TimeUnit; @Component
public class ApiHolder { // 声明一个ObjectMapper实例,用于JSON的序列化和反序列化 private ObjectMapper mapper; /** * 创建一个服务接口的实例,无需代理。 * * @param clazz 服务接口的类型 * @param serviceUrl 服务的基础URL * @return 服务接口的实例 */ public <T> T create(Class<T> clazz, String serviceUrl) { return getRetrofit(serviceUrl).create(clazz); } /** * 创建一个服务接口的实例,通过指定的代理。 * * @param clazz 服务接口的类型 * @param serviceUrl 服务的基础URL * @param proxy 网络请求使用的代理 * @return 服务接口的实例 */ public <T> T create(Class<T> clazz, String serviceUrl, Proxy proxy) { return getRetrofit(serviceUrl, proxy).create(clazz); } /** * 私有方法,用于构建Retrofit实例,无需代理。 * * @param serviceUrl 服务的基础URL * @return Retrofit的实例构建器 */ private Retrofit getRetrofit(String serviceUrl) { // 如果ObjectMapper实例未初始化,则进行初始化 if (this.mapper == null) { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); this.mapper = mapper; } // 配置OkHttpClient的连接、读写超时 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); // 使用Retrofit.Builder构建Retrofit实例 // 注意:这里应该使用Retrofit.Builder来构建Retrofit实例,但代码示例中可能有误 return new Retrofit.Builder() // 假设这里应该是 Retrofit.Builder().build() 的一个简化表示 .addConverterFactory(JacksonConverterFactory.create(mapper)) .client(client) .baseUrl(serviceUrl) .build(); } /** * 私有方法,用于构建Retrofit实例,通过指定的代理。 * * @param serviceUrl 服务的基础URL * @param proxy 网络请求使用的代理 * @return Retrofit的实例构建器 */ private Retrofit getRetrofit(String serviceUrl, Proxy proxy) { // ObjectMapper的初始化同上 if (this.mapper == null) { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); this.mapper = mapper; } // 配置OkHttpClient,包括代理设置 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .proxy(proxy) .build(); // 使用Retrofit.Builder构建Retrofit实例,同上 return new Retrofit.Builder() // 同样,这里应该是 Retrofit.Builder().build() 的一个简化表示 .addConverterFactory(JacksonConverterFactory.create(mapper)) .client
2、定义 API 外部接口
package com.dc.pub.apiHolder.api;import com.dc.pub.apiHolder.apiModel.*;
import retrofit2.Call;
import retrofit2.http.*;import java.util.ArrayList;public interface DataCenterApi {@GET("SingleWindow/BatchGetEntrySubValidDate")Call<ArrayList<SubEntry>> GetEntrySubValidDate(@Header("Authorization") String token, @Query("tradeCode") String tradeCode);}
3、初始化外部接口的bean
package com.dc.pub.jobs.config; import com.dc.pub.apiHolder.ApiHolder; // 引入ApiHolder接口,该接口负责创建和管理API的实例
import com.dc.pub.apiHolder.api.DataCenterApi; // 引入DataCenterApi接口,该接口定义了与数据中心交互的方法
import com.dc.pub.apiHolder.api.XdoHttpProxyApi; // 注意:XdoHttpProxyApi在此段代码中未被直接使用,但可能用于其他配置或组件
import org.springframework.beans.factory.annotation.Value; // 引入@Value注解,用于注入配置文件中的值
import org.springframework.context.annotation.Bean; // 引入@Bean注解,用于声明一个Bean,由Spring容器管理
import org.springframework.context.annotation.Configuration; // 引入@Configuration注解,表明该类是一个配置类 /** * ApiConfig 类是一个Spring配置类,用于配置和管理API相关的Bean。 * 它通过读取外部配置(如application.properties或application.yml)中的值, * 并利用这些值来创建和配置API接口的实例。 */
@Configuration
public class ApiConfig { // 使用@Value注解从配置文件中读取dataCenter.url的值,并注入到dataCenterUrl变量中 @Value("${dataCenter.url}") private String dataCenterUrl; /** * 使用@Bean注解声明一个方法,该方法返回一个DataCenterApi类型的Bean实例。 * 这个Bean实例是通过ApiHolder的create方法创建的,它接受DataCenterApi.class(指定要创建的API类型) * 和dataCenterUrl(API的URL地址)作为参数。 * * @param apiHolder ApiHolder的实例,用于创建API接口的实例 * @return 返回配置好的DataCenterApi实例 */ @Bean public DataCenterApi getDataCenterApi(ApiHolder apiHolder) { return apiHolder.create(DataCenterApi.class, dataCenterUrl); } // 注释: // 1. 该配置类使得Spring框架能够在应用启动时自动发现和注册DataCenterApi的Bean实例。 // 2. 通过外部配置(如application.properties)灵活地配置API的URL,提高了系统的可配置性和灵活性。 // 3. ApiHolder是一个关键的组件,它可能封装了HTTP客户端的实现细节,使得API的创建和使用更加简单和统一。 // 4. 尽管XdoHttpProxyApi接口被引入了,但在这个配置类中并没有直接使用它,可能是在其他地方或者将来的配置中会被用到。
}
4、调用接口、获取参数
// 假设 pmsSession 和 params 已经定义好
String accessToken = pmsSession.getAccessToken();
String tradeCode = params.getTradeCode(); // 假设 params 是一个 Map<String, String>try {// 发起请求Response<ArrayList<SubEntry>> subEntryResponse = dataCenterApi.GetEntrySubValidDate(accessToken, tradeCode).execute();// 检查响应状态if (subEntryResponse.isSuccessful()) {ArrayList<SubEntry> subEntries = subEntryResponse.body();// 处理返回的数据} else {// 处理失败情况int statusCode = subEntryResponse.code();// 可以检查具体的错误码}
} catch (IOException e) {// 处理网络错误e.printStackTrace();
}
Retrofit 和 OkHttp 是 Android 开发中常用的 HTTP 网络请求库。Retrofit 是一个类型安全的 HTTP 客户端,而 OkHttp 是一个底层的 HTTP 库,用于处理网络请求的具体实现。Retrofit 通常使用 OkHttp 作为其底层实现,提供更高级别的 API 进行网络请求。