您的位置:首页 > 财经 > 产业 > 实际项目中,运用Retrofit和OkHttp调用其他项目接口

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

2024/11/17 10:06:02 来源:https://blog.csdn.net/qq_42478982/article/details/141556413  浏览:    关键词:实际项目中,运用Retrofit和OkHttp调用其他项目接口

先引入依赖

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链接实例

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 外部接口

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

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、调用接口、获取参数

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com