iis服务器助手广告
返回顶部
首页 > 资讯 > 移动开发 >android Retrofit2+okHttp3使用总结
  • 224
分享到

android Retrofit2+okHttp3使用总结

okhttpretrofit2retrofitAndroid 2022-06-06 01:06:12 224人浏览 泡泡鱼
摘要

使用前准备 Build.gradle文件配置 dependencies配置 compile 'com.squareup.retrofit2:retrofit:2.0.0'

使用前准备

Build.gradle文件配置

dependencies配置


compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.okHttp3:logging-interceptor:3.2.0'

网络框架搭建

服务创建类封装(HTTP):


public class ServiceGenerator {
 public static final String api_BASE_URL = "";
 public static int READ_TIMEOUT = 60;
 public static int WRIT_TIMEOUT = 60;
 public static int CONNECT_TIMEOUT = 60;
 private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
   .readTimeout(READ_TIMEOUT,TimeUnit.SECONDS)//设置读取超时时间
   .writeTimeout(WRIT_TIMEOUT,TimeUnit.SECONDS)//设置写的超时时间
   .connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS);
 private static Retrofit.Builder builder =
   new Retrofit.Builder()
     .baseUrl(API_BASE_URL)     .addConverterFactory(GsonConverterFactory.create());
 public static <S> S createService(Class<S> serviceClass) {
  return createService(serviceClass, null);
 }
 public static <S> S createService(Class<S> serviceClass, final String authToken) {
  if (authToken != null) {
   httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Interceptor.Chain chain) throws ioException {
     Request original = chain.request();
     // Request customization: add request headers
     Request.Builder requestBuilder = original.newBuilder()
       .method(original.method(), original.body());
     Request request = requestBuilder.build();
     return chain.proceed(request);
    }
   });
  }
  OkHttpClient client = httpClient
    // 日志拦截器
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();
  Retrofit retrofit = builder.client(client).build();
  return retrofit.create(serviceClass);
 }
}

使用说明:

API_BASE_URL 用来配置api主地址

READ_TIMEOUT 用来配置读取超时时间

WRIT_TIMEOUT 用来配置写超时时间

CONNECT_TIMEOUT 用来配置连接超时时间

addConverterFactory() 用来设置解析器,此处我们设置的是gson的解析

addInterceptor() 用来设置日志拦截器

服务创建类封装(HTTPS):


 public class httpsServiceGenerator {
 public static final String API_BASE_URL = "";
 public static int READ_TIMEOUT = 250;
 public static int WRIT_TIMEOUT = 250;
 public static int CONNECT_TIMEOUT = 250;
 private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
 private static Retrofit.Builder builder =
   new Retrofit.Builder()
     .baseUrl(API_BASE_URL)     .addConverterFactory(GsonConverterFactory.create());
 public static <S> S createService(Class<S> serviceClass) {
  return createService(serviceClass, null);
 }
 public static <S> S createService(Class<S> serviceClass, final String authToken) {
  if (authToken != null) {
   httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
     Request original = chain.request();
     // Request customization: add request headers
     Request.Builder requestBuilder = original.newBuilder()
       .method(original.method(), original.body());
     Request request = requestBuilder.build();
     return chain.proceed(request);
    }
   });
  }
  Retrofit retrofit = builder.client(getUnsafeOkHttpClient()).build();
  return retrofit.create(serviceClass);
 }
 private static OkHttpClient getUnsafeOkHttpClient() {
  try {
   // Create a trust manager that does not validate certificate chains
   final TrustManager[] trustAllCerts = new TrustManager[]{
     new X509TrustManager() {
      @Override
      public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
      }
      @Override
      public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
      }
      @Override
      public java.security.cert.X509Certificate[] getAcceptedIssuers() {
       X509Certificate[] x509Certificates = new X509Certificate[0];
       return x509Certificates;
      }
     }
   };
   // Install the all-trusting trust manager
   final SSLContext sslContext = SSLContext.getInstance("SSL");
   sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
   // Create an ssl Socket factory with our all-trusting manager
   final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
   OkHttpClient okHttpClient =
     new OkHttpClient.Builder()
       .readTimeout(READ_TIMEOUT,TimeUnit.SECONDS)//设置读取超时时间
       .writeTimeout(WRIT_TIMEOUT,TimeUnit.SECONDS)//设置写的超时时间
       .connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS)
       .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
       .sslSocketFactory(sslSocketFactory)
       .hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
         return true;
        }
       }).build();
   return okHttpClient;
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

使用说明:

可以看出https 和http的服务类主要区别在于retrofit对象的构造方法不同。

主要就是sslSocketFactory()方法。是用来添加sslsocketFactory的,也就是客户端发送的请求都等于手持了这样的证书,这样就可以和服务器交互了。

SslsocketFactory对象的获取方法如下:


final SSLContext sslContext = SSLContext.getInstance("SSL");
   sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
   final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

请求体和响应体封装:


 {
 "page":2,
 "pageSize":10
}

JSON体类似如上所示的可以封装为如下的请求体/响应体,此处可以借用GsonFORMat插件,输入json体就可以快速生产请求体/响应体bean类。


public class GetTradeDetailRequest {
 
 private int page;
 private int pageSize;
 public int getPage() {
  return page;
 }
 public void setPage(int page) {
  this.page = page;
 }
 public int getPageSize() {
  return pageSize;
 }
 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
}

服务接口封装:


public interface BalanceService {
 @GET("balance")
 Call<GetBalanceResponse> getBalance(@Header("AccessToken") String accessToken);
 @POST("balance/detail")
 Call<GetTradeDetailResponse> getDetail(@Header("AccessToken") String accessToken , @Body GetTradeDetailRequest tradeDetailRequest);
}

使用说明:

此接口用来声明请求类型,call声明的类型是返回体的bean类,@header是请求的头,@body是返回体的类型。

请求model封装:


public class BalanceModel {
 private static BalanceModel balanceModel;
 private BalanceService mBalanceService;
 
 public static BalanceModel getInstance(Context context) {
  if (balanceModel == null) {
   balanceModel = new BalanceModel(context);
  }
  return balanceModel;
 }
 public BalanceModel(Context context) {
  mBalanceService = HttpsServiceGenerator.createService(BalanceService.class);
 }
 public Call<GetBalanceResponse> getBalanceResponseCall(String accessToken) {
  Call<GetBalanceResponse> balanceResponseCall = mBalanceService.getBalance(accessToken);
  return balanceResponseCall;
 }
}

使用说明:

此接口用来声明请求model的,主要用到的是上面的服务接口。 此类主要用来获取网络请求体的。

响应事件回调类封装:


public abstract class Callback<T extends Object> implements retrofit2.Callback<T> {
 @Override
 public void onResponse(Call<T> call, Response<T> response) {
  if (response.raw().code() == 200){
   Log.i("internet response","200");
   onSuccess(response);
  }else if (response.raw().code() == 404){
   Log.i("internet response","404");
   onNotFound();
  }
 }
 @Override
 public void onFailure(Call<T> call, Throwable t) {
 }
 public abstract void onSuccess(Response<T> response);
 public void onNotFound(){
  return;
 }
}

使用说明:

通常在发送网络请求的时候只有两种结果,一是请求发送失败,二是服务器接收到了请求并且响应了。

onFailure()主要用来处理请求发送失败的情况,onResponse()用来处理服务器的响应内容。

response.raw().code()的值就是我们在网站开发中遇到的标识代码,200代表成功返回消息体,404代表api路径没找到(api路径配置出错是会导致这样的情况,当然也可能是服务器的环境出了问题,导致手机访问不到),500代表的是服务器内部错误(请求中的参数配置有误会导致这样的情况)。

代码中使用:


private void httpLoginRequest(String phone, String passWord) {
  mPushToken = mPushAgent.getReGIStrationId();
  GetLoginRequest loginRequest = new GetLoginRequest();
  loginRequest.setPhone(phone);
  loginRequest.setPassword(password);
  loginRequest.setPushtoken(mPushToken);
  loginRequest.setCarrier(mCarrier);
  final Call<GetLoginResponse> callLogin = loginModel.getLoginResponseCall(loginRequest);
  callLogin.enqueue(new Callback<GetLoginResponse>() {
   @Override
   public void onFailure(Call<GetLoginResponse> calllist, Throwable t) {
    ToastUtils.showToast(LoginActivity.this,"网络服务异常");
    materialDialog.dismiss();
    callLogin.cancel();
   }
   @Override
   public void onSuccess(Response<GetLoginResponse> response) {
    GetLoginResponse loginResponse = response.body();
    userBean = loginResponse.getData();
    if (loginResponse.getErrcode() == 0) {
     ToastUtils.showToast(LoginActivity.this,"登录成功");
     ActivityCollector.finishAll();
     startActivity(new Intent(LoginActivity.this, MapActivity.class));
     AppConfigUtils.getInstanse(LoginActivity.this).clearAll();
     AppConfigUtils.getInstanse(LoginActivity.this).setUserBean(userBean);
     materialDialog.dismiss();
    } else if (loginResponse.getErrcode() == 203) {
     ToastUtils.showToast(LoginActivity.this,"用户名或密码错误");
     materialDialog.dismiss();
    }else if (loginResponse.getErrcode() == 999){
     materialDialog.dismiss();
     ToastUtils.showToast(LoginActivity.this,"服务器异常,请稍后再试");
    }
    callLogin.cancel();
   }
   @Override
   public void onNotFound() {
    materialDialog.dismiss();
    ToastUtils.showToast(LoginActivity.this,"404");
    super.onNotFound();
    callLogin.cancel();
   }
  });
 }
private void httpBalanceRequest(String accessToken) {
  BalanceModel balanceModel = BalanceModel.getInstance(getApplicationContext());
  final Call<GetBalanceResponse> balanceResponseCall = balanceModel.getBalanceResponseCall(accessToken);
  balanceResponseCall.enqueue(new Callback<GetBalanceResponse>() {
   @Override
   public void onResponse(Call<GetBalanceResponse> calllist, Response<GetBalanceResponse> response) {
    GetBalanceResponse balanceResponse = response.body();
    if (balanceResponse.getErrcode() == 0) {
     mMoneyTV.setText(balanceResponse.getData().getBalance());
    } else if (balanceResponse.getErrcode() == 999) {
     ToastUtils.showToast(BalanceActivity.this,"服务器异常,请稍后再试");
     mMoneyTV.setText("0.00");
    } else if (balanceResponse.getErrcode() == 403) {
     ToastUtils.showToast(BalanceActivity.this,"登录已失效,请重新登录");
     AppConfigUtils.getInstanse(BalanceActivity.this).clearAll();
     ActivityCollector.finishAll();
     LoginActivity.actionStart(BalanceActivity.this,mPhone,"");
    }
    balanceResponseCall.cancel();
   }
   @Override
   public void onFailure(Call<GetBalanceResponse> calllist, Throwable t) {
    ToastUtils.showToast(BalanceActivity.this,"网络服务异常");
    balanceResponseCall.cancel();
   }
  });
 }

使用说明:

这段代码使用的是自己封装的响应事件回调类,当然也可以用第二张图retrofit默认的那套,用自己封装的有个好处就是404not found 可以处理进行操作,如果用默认的那套,在404的时候这段代码就会崩溃。

您可能感兴趣的文章:简略分析Android的Retrofit应用开发框架源码Android app开发中Retrofit框架的初步上手使用详解RxJava2 Retrofit2 网络框架简洁轻便封装Android Retrofit 中文乱码问题的解决办法为Retrofit统一添加post请求的默认参数的方法Android网络请求框架Retrofit详解Android如何通过Retrofit提交Json格式数据Retrofit实现图文上传至服务器详解Retrofit2.0 公共参数(固定参数)如何动态改变Retrofit的base url和rest版本详解


--结束END--

本文标题: android Retrofit2+okHttp3使用总结

本文链接: https://www.lsjlt.com/news/21846.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android Retrofit2+okHttp3使用总结
    使用前准备Build.gradle文件配置dependencies配置compile 'com.squareup.retrofit2:retrofit:2.0.0'compile 'com.squareup.retrofit2:conver...
    99+
    2023-05-31
    okhttp retrofit roi
  • Android使用okhttp3和retrofit2进行单文件和多文件上传
    目录前言一、单文件上传1、apiService中2、acivity代码二、多文件上传 1、apiservice中2、acivity代码总结 前言 开发项目中需要进行单文件多...
    99+
    2022-11-13
    android 单文件 android多文件上传 android 使用 okhttp3和retrofit2 文件上传
  • Android ViewModel的使用总结
    目录基本使用 MainRepositoryMainViewModelMainActivityViewModel 相关问题是高频面试题。主要源于它是 MVVM 架构模式的重要组件,并且...
    99+
    2024-04-02
  • Android Notification使用方法总结
    Android Notification使用方法总结一. 基本使用1.构造notification NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(a...
    99+
    2023-05-30
    android notification roi
  • Android onCreateOptionsMenu的使用方法总结
    Android onCreateOptionsMenu的使用方法总结任何一款软件都少不了对“菜单”的使用。在Android下,每一个activity都捆绑了一个Menu,要想定义和使用菜单,都必须在Activity下进行操作,复写onCre...
    99+
    2023-05-30
    android oncreateoptionsmenu roi
  • Android WebView的使用方法总结
     Android WebView的使用方法  Android app打开H5页一般要实现如下需求:打开指定url网页;2、点击链接可以跳转到下一页,并更新标题;3、按back键或左箭头可以返回上一页;4、当webview...
    99+
    2023-05-30
    android webview roi
  • Android中Glide库的使用小技巧总结
    简介在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。https://githu...
    99+
    2023-05-30
    android glide库 使用技巧
  • Android 布局中的android:onClick的使用方法总结
    Android 布局中的android:onClick的使用方法总结Android布局中的 android:onClick=“...”属性设置点击时从上下文中调用指定的方法。该属性值和要调用的方法名称完全一致。一般在Activity定义符合...
    99+
    2023-05-30
    android onclick roi
  • sqlite3使用总结
           OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具集里。OS X包装的是第三版的SQLite,又称SQLite3。这套软件有几个特色:软件属于公共财(public domain),SQLite可说...
    99+
    2023-01-31
  • clipboard.js使用总结
    目录(1)介绍: (2)clipboard复印内容的方式有 (3)Function操作有两种: (4)通过属性返回复印的内容 (5)函数和属性的兼容方式 (1)介绍: clipbo...
    99+
    2024-04-02
  • BigDecimal使用总结
    对于超过16位的大型数字,需要用到Java在java.math包中提供的API类BigDecimal,而且也不是传统的+-*/,而是调用对应的方法。 1.创建对象 使用new的方式创建BigDecim...
    99+
    2023-09-03
    java BigDecimal
  • redis 使用总结
    最近一段时间与redis接触比较频繁。发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下。本篇文章主要是以总结性的方式梳理,因为redis的主题很大,任何一个技术点展开都是几篇文章的量。也可以说这篇...
    99+
    2024-04-02
  • w3m使用总结
    ...
    99+
    2023-01-31
    w3m
  • Android Notification的多种用法总结
    Android Notification的多种用法总结我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问...
    99+
    2023-05-31
    android notification roi
  • android 各种存储目录使用总结之Context#getExternalFilesDir
    Context类中定义了获取手机系统目录的一些api。这里做一个总结: 一、api 注释翻译 File getExternalFilesDir(@Nullable String type) @Nullablepublic abstract ...
    99+
    2023-09-02
    android java
  • Java ArrayList使用总结
    目录类图源码解析新增和扩容实现扩容的本质删除总结提起ArrayList,相信很多小伙伴都用过,而且还不少用。但在几年之前,我在一场面试中,面试官要求说出ArrayList的扩容机制。...
    99+
    2024-04-02
  • aws S3使用总结
      最近公司要上海外项目,要用到亚马逊。可把我折腾的够呛。好多坑。不得不说亚马逊的东西挺好最起码服务器性能比阿里云强多了。但在人性化这一点做的不如阿里。反正是各有千秋  这里说一下我的案例:要把图片cdn上的图片传到S3。这里我试了很多方法...
    99+
    2023-01-31
    aws
  • Android Intent调用 Uri的方法总结
    Android Intent调用 Uri的方法总结//调用浏览器Uri uri = Uri.parse(""); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(i...
    99+
    2023-05-30
    android intent uri
  • Android消息机制Handler用法总结
    1.简述 Handler消息机制主要包括: MessageQueue、 Handler、 Looper、Message。 Message:需要传递的消息,可以传递数据; ...
    99+
    2024-04-02
  • Android图片加载框架Coil的详细使用总结
    目录简介简单使用高斯模糊圆角圆形灰色变换 GrayscaleTransformationGif监听下载过程取消下载替换 okhttp 实例自定义Coil 源码分析总结简介 Coil ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作