实际项目中,运用Retrofit和OkHttp调用其他项目接口

先引入依赖

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 进行网络请求。

相关推荐
草履虫建模6 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
wenzhangli78 小时前
OoderAgent SDK(0.6.6) UDP通讯与协议测试深度解析
网络·网络协议·udp
安科士andxe8 小时前
60km 远距离通信新选择:AndXe SFP-155M 单模单纤光模块深度测评
网络·信息与通信
qq_297574678 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚8 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学8 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang201509288 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚9 小时前
Java入门17——异常
java·开发语言
酥暮沐9 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
缘空如是9 小时前
基础工具包之JSON 工厂类
java·json·json切换