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

相关推荐
老汉忒cpp5 分钟前
TCP全连接队列和tcpdump抓包
网络·tcp/ip·tcpdump
小黑爱编程6 分钟前
【Linux网络】Socket套接字
linux·运维·网络
KookeeyLena79 分钟前
udp协议除了打游戏还有什么用途
网络·网络协议·udp
星夜孤帆13 分钟前
LeetCode之数组/字符串
java·算法·leetcode
GISer小浪花努力上岸3 小时前
Java实现简易计算器功能(idea)
java·开发语言·intellij-idea
海海向前冲3 小时前
设计模式 -- 单例设计模式
java·开发语言·设计模式
就这样很好8803 小时前
排序算法总结
java·算法·排序算法
alsknv3 小时前
IP地址是怎么实现HTTPS访问的?
网络·网络协议·tcp/ip·安全·web安全·http·https
weixin_486681144 小时前
C++系列-STL中find相关的算法
java·c++·算法
limengshi1383924 小时前
通信工程学习:什么是GFP通用成帧规范
服务器·网络·网络协议·学习·信息与通信