项目的网络请求开发中retrofit2和okhttp3的结合使用示例

2023-12-15 14:58

本文主要是介绍项目的网络请求开发中retrofit2和okhttp3的结合使用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是retrofit2和okhttp3的结合使用的简单示例,逻辑不复杂,示例代码中使用的框架版本是okhttp:4.4.0和retrofit:2.7.2,下文将贴出所有代码:

项目结构:

AndroidManifest的配置: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.windfallsheng.retrofitandokhttpexample"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!--用于访问网络--><uses-permission android:name="android.permission.INTERNET"></uses-permission><applicationandroid:name=".MySupportApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

build.gradle的配置内容:

apply plugin: 'com.android.application'android {compileSdkVersion 28defaultConfig {applicationId "com.windfallsheng.retrofitandokhttpexample"minSdkVersion 16targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'// 加入依赖implementation "com.squareup.okhttp3:okhttp:4.4.0"implementation "com.squareup.okhttp3:logging-interceptor:4.4.0"implementation "com.squareup.retrofit2:retrofit:2.7.2"implementation "com.squareup.retrofit2:converter-gson:2.7.2"implementation "com.google.code.gson:gson:2.8.6"
}

 使用:

package com.windfallsheng.retrofitandokhttpexample;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.windfallsheng.retrofitandokhttpexample.net.Param;
import com.windfallsheng.retrofitandokhttpexample.net.ResponseEntity;
import com.windfallsheng.retrofitandokhttpexample.net.RetrofitManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;public class MainActivity extends AppCompatActivity {private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 设置请求参数的过程;List<Param> paramList = new ArrayList<>();paramList.add(new Param("sex", "0"));paramList.add(new Param("age", "25"));Map paramMap = new HashMap();for (Param param : paramList) {paramMap.put(param.getKey(), param.getValue());}Call call = RetrofitManager.getDefault(ServerHost.USER_INFO).getUserList(RetrofitManager.getCacheControl(), paramMap);// 开始网络请求:call.enqueue(new Callback<ResponseEntity>() {@Overridepublic void onResponse(retrofit2.Call<ResponseEntity> call, Response<ResponseEntity> response) {Log.d(TAG, "method:login#onResponse#response.isSuccessful=" + response.isSuccessful());if (response.isSuccessful()) {Log.d(TAG, "method:login#onResponse#ResponseEntity=" + response.body());}}@Overridepublic void onFailure(retrofit2.Call call, Throwable t) {Log.d(TAG, "method:login#onFailure#t=" + t);}});}
}

接口定义:

package com.windfallsheng.retrofitandokhttpexample.net;import android.database.Observable;
import java.util.Map;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PartMap;/*** @author lzsheng 请求接口;*/
public interface APIService {@FormUrlEncoded@POST("mobileuser/login")Observable<ResponseEntity> login(@Header("Cache-Control") String cacheControl, @Field("phoneNumber") String account,@Field("password") String password);@Multipart@POST("mobileuser/register")Observable<ResponseEntity> registe(@PartMap Map<String, RequestBody> multipartMap);@FormUrlEncoded@POST("mobileuser/userlist")Call<ResponseEntity> getUserList(@Header("Cache-Control") String cacheControl, @FieldMap Map<String, String> params);}

网络请求及初始化配置管理类:

package com.windfallsheng.retrofitandokhttpexample.net;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.windfallsheng.retrofitandokhttpexample.MySupportApplication;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;/*** 缓存设置* 1. noCache 不使用缓存,全部走网络* 2. noStore 不使用缓存,也不存储缓存* 3. onlyIfCached 只使用缓存* 4. maxAge 设置最大失效时间,失效则不使用 需要服务器配合* 5. maxStale 设置最大失效时间,失效则不使用 需要服务器配合* 6. minFresh 设置有效时间,依旧如上* 7. FORCE_NETWORK 只走网络* 8. FORCE_CACHE 只走缓存*/
public class RetrofitManager {private static final String TAG = "RetrofitManager";//读超时长,单位:毫秒public static final int READ_TIME_OUT = 7676;//连接时长,单位:毫秒public static final int CONNECT_TIME_OUT = 7676;public Retrofit mRetrofit;public APIService mAPIService;public OkHttpClient mOkHttpClient;private static SparseArray<RetrofitManager> sRetrofitManager = new SparseArray<>(ServerHost.values().length);/*** 设缓存有效期为两天*/private static final long CACHE_STALE_SEC = 60 * 60 * 24 * 2;/*** 查询缓存的Cache-Control设置,为if-only-cache时只查询缓存而不会请求服务器,max-stale可以配合设置缓存失效时间* max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可接收超出超时期指定值之内的响应消息。*/private static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;/*** 查询网络的Cache-Control设置,头部Cache-Control设为max-age=0* (假如请求了服务器并在a时刻返回响应结果,则在max-age规定的秒数内,浏览器将不会发送对应的请求到服务器,数据由缓存直接返回)时则不会使用缓存而请求服务器*/private static final String CACHE_CONTROL_AGE = "max-age=0";//构造方法私有private RetrofitManager(String baseUrl) {//开启LogHttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//缓存File cacheFile = new File(MySupportApplication.getInstance().getCacheDir(), "cache");Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb//增加头部信息Interceptor headerInterceptor = new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request build = chain.request().newBuilder().addHeader("Content-Type", "application/json").build();return chain.proceed(build);}};mOkHttpClient = new OkHttpClient.Builder().readTimeout(READ_TIME_OUT, TimeUnit.MILLISECONDS).connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS).addInterceptor(mRewriteCacheControlInterceptor).addNetworkInterceptor(mRewriteCacheControlInterceptor).addInterceptor(headerInterceptor).addInterceptor(logInterceptor).cache(cache).build();Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").serializeNulls().create();mRetrofit = new Retrofit.Builder().client(mOkHttpClient).addConverterFactory(GsonConverterFactory.create(gson))
//                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()).baseUrl(baseUrl).build();mAPIService = mRetrofit.create(APIService.class);}/*** @param serverHost {@link ServerHost}*/public static APIService getDefault(ServerHost serverHost) {Log.d(TAG, "method:getDefault#sRetrofitManager=" + sRetrofitManager);int hostType = serverHost.getHostType();RetrofitManager retrofitManager = sRetrofitManager.get(hostType);if (retrofitManager == null) {retrofitManager = new RetrofitManager(serverHost.getBaseUrl());sRetrofitManager.put(hostType, retrofitManager);}return retrofitManager.mAPIService;}/*** OkHttpClient** @return*/public static OkHttpClient getOkHttpClient(ServerHost serverHost) {int hostType = serverHost.getHostType();String baseUrl = serverHost.getBaseUrl();RetrofitManager retrofitManager = sRetrofitManager.get(hostType);if (retrofitManager == null) {retrofitManager = new RetrofitManager(baseUrl);sRetrofitManager.put(hostType, retrofitManager);}return retrofitManager.mOkHttpClient;}/*** 根据网络状况获取缓存的策略*/public static String getCacheControl() {return isNetworkAvailable(MySupportApplication.getInstance()) ? CACHE_CONTROL_AGE : CACHE_CONTROL_CACHE;}/*** 响应头拦截器,用来配置缓存策略* Dangerous interceptor that rewrites the server's cache-control header.*/private final Interceptor mRewriteCacheControlInterceptor = new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();String cacheControl = request.cacheControl().toString();if (!isNetworkAvailable(MySupportApplication.getInstance())) {request = request.newBuilder().cacheControl(TextUtils.isEmpty(cacheControl) ? CacheControl.FORCE_NETWORK : CacheControl.FORCE_CACHE).build();}Response originalResponse = chain.proceed(request);if (isNetworkAvailable(MySupportApplication.getInstance())) {//有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置return originalResponse.newBuilder().header("Cache-Control", cacheControl).removeHeader("Pragma").build();} else {return originalResponse.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC).removeHeader("Pragma").build();}}};private static boolean isNetworkAvailable(Context context) {ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivity != null) {//ACCESS_NETWORK_STATENetworkInfo info = connectivity.getActiveNetworkInfo();if (info != null && info.isConnected()) {// 当前网络是连接的if (info.getState() == NetworkInfo.State.CONNECTED) {// 当前所连接的网络可用return true;}}}return false;}}

 定义各host的枚举类:

package com.windfallsheng.retrofitandokhttpexample.net;/*** @author lzsheng host的枚举;*/
public enum ServerHost {USER_INFO(1, "http://192.*.*.*:8066/"), NEWS_FLASH(2, "https://192.*.*.*:8080/");private int hostType;private String baseUrl;private ServerHost(int type, String baseUrl) {this.hostType = type;this.baseUrl = baseUrl;}public int getHostType() {return hostType;}public void setHostType(int hostType) {this.hostType = hostType;}public String getBaseUrl() {return baseUrl;}public void setBaseUrl(String baseUrl) {this.baseUrl = baseUrl;}
}

其它相关类:

package com.windfallsheng.retrofitandokhttpexample;import android.app.Application;
import android.content.Context;public class MySupportApplication extends Application {private static Context mContext;@Overridepublic void onCreate() {super.onCreate();mContext = this;}public static Context getInstance() {return mContext;}
}
package com.windfallsheng.retrofitandokhttpexample.net;import com.google.gson.annotations.SerializedName;
import java.io.Serializable;/*** @Author: lzsheng* @Description: 网络请求的返回值实体类, 使用新版本Gson的jar包,修改注解 @SerializedName(value = "val",* alternate = {"alt1", "alt2"})* @Version:*/
public class ResponseEntity<T> implements Serializable {@SerializedName(value = "code", alternate = {"rt", "result"})private int resultCode;@SerializedName("success")private boolean isSuccess;@SerializedName(value = "msg", alternate = {"message", "content"})private String resultMsg;private T data;public int getResultCode() {return resultCode;}public void setResultCode(int resultCode) {this.resultCode = resultCode;}public boolean isSuccess() {return isSuccess;}public void setSuccess(boolean success) {isSuccess = success;}public String getResultMsg() {return resultMsg;}public void setResultMsg(String resultMsg) {this.resultMsg = resultMsg;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "ResponseEntity{" +"resultCode=" + resultCode +", isSuccess=" + isSuccess +", resultMsg='" + resultMsg + '\'' +", data=" + data +'}';}
}
package com.windfallsheng.retrofitandokhttpexample.net;/*** @author lzsheng 请求参数的键值对*/
public class Param {private String key;private String value;public Param() {}public Param(String key, String value) {super();this.key = key;this.value = value;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic String toString() {return "Param [key=" + key + ", value=" + value + "]";}}

       有关网络请求相关业务的处理方式多种多样,根据自己的项目状态和业务需求,做相应的业务封闭即可,以上只是简单演示,不必苛责。

 

由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!

Hello , World !

感谢所有!

这篇关于项目的网络请求开发中retrofit2和okhttp3的结合使用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/496853

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主