实际项目中,运用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 进行网络请求。

相关推荐
你想考研啊22 分钟前
linux安装jdk和tomcat和并自启动
java·linux·tomcat
悟能不能悟2 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
机器学习之心3 小时前
基于双向时序卷积网络(BiTCN)与支持向量机(SVM)混合模型的时间序列预测代码Matlab源码
网络·支持向量机·matlab
高山上有一只小老虎3 小时前
java 正则表达式大全
java·正则表达式
_院长大人_4 小时前
设计模式-工厂模式
java·开发语言·设计模式
止水编程 water_proof4 小时前
Java-HTTP响应以及HTTPS(下)
网络·网络协议·http
凌波粒5 小时前
MyBatis完整教程IDEA版(2)--ResultMap/注解/一对多/多对一/lombok/log4j
java·intellij-idea·mybatis
蓝-萧5 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key5 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
好望角雾眠5 小时前
第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP
网络·笔记·网络协议·tcp/ip·c#·modbus