先引入依赖
java
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链接实例
java
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 外部接口
java
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
java
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、调用接口、获取参数
java
// 假设 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 进行网络请求。