新手如何用Retrofit调用Pexels API并在同项目中接入多套API?
基于Retrofit对接Pexels API及多API适配方案
对接Pexels API基础实现逻辑
1. 定义数据实体类
根据你需要的字段定义对应实体类,字段名需和接口返回参数匹配,不匹配的可以用@SerializedName做映射:
// 图片地址嵌套实体 public class Src { private String original; private String medium; private String thumbnail; // 按需补充其他尺寸字段,省略getter、setter方法 } // 图片核心信息实体 public class Photo { private long id; private String url; private String photographer; private Src src; // 省略getter、setter方法 } // 列表接口返回外层包装实体 public class PhotoResponse { private List<Photo> photos; // 省略getter、setter方法 }
2. 定义API请求接口
对应Pexels的精选、搜索接口定义请求方法,注意接口需要传入授权密钥:
public interface PexelsApi { // 获取精选图片 @GET("curated") Call<PhotoResponse> getCuratedPhotos(@Header("Authorization") String apiKey, @Query("page") int page, @Query("per_page") int pageSize); // 搜索图片 @GET("search") Call<PhotoResponse> searchPhotos(@Header("Authorization") String apiKey, @Query("query") String keyword, @Query("page") int page, @Query("per_page") int pageSize); }
3. 单API场景调用逻辑
把Pexels的根地址赋值给ROOT_URL,直接调用原有getApiService()方法拿到PexelsApi实例,即可发起请求。
多套API接入的RetrofitClient改造方案
你现有代码硬绑定了固定baseUrl,仅支持单套API,调整后可支持多套API共存,核心思路是按baseUrl缓存不同的Retrofit实例,通用化Service创建逻辑:
public class RetrofitClient { // 缓存不同baseUrl对应的Retrofit实例,避免重复创建 private static final HashMap<String, Retrofit> retrofitCache = new HashMap<>(); private RetrofitClient() {} private static Retrofit getRetroClient(String baseUrl) { // 已有对应实例直接返回 if (retrofitCache.containsKey(baseUrl)) { return retrofitCache.get(baseUrl); } Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) // 若不同API需要不同拦截器、转换器,可在此处加分支逻辑区分配置 .build(); retrofitCache.put(baseUrl, retrofit); return retrofit; } // 泛型通用方法,传入对应API的baseUrl和Service接口Class即可生成实例 public static <T> T getApiService(String baseUrl, Class<T> serviceClass) { return getRetroClient(baseUrl).create(serviceClass); } }
改造后使用方式
- 接入Pexels API:定义Pexels根地址常量,调用
RetrofitClient.getApiService(PEXELS_BASE_URL, PexelsApi.class)获取接口实例 - 接入第二套API:单独定义第二套API的根地址、对应的Service接口类,传入对应参数调用上述通用方法即可生成对应接口实例,两套API互不干扰。
内容的提问来源于stack exchange,提问作者Abed
相关产品推荐
相关产品推荐

