android Retrofit2网络请求封装介绍
作者:扒鸡撕坦 发布时间:2022-02-09 18:46:49
标签:Android,Retrofit2,封装
1. Retrofit使用
Retrofit是一个现在网络请求框架,先来说一下怎么使用
网络权限(添加到AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
gradle依赖(添加到build.gradle)
implementation("com.squareup.okhttp3:okhttp:4.9.2")
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
定义接口,网络请求的方法
public interface Request {
@GET("/xx/xx")
Call<ResponseBody> get();
}
实例化Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("BASE_URL").build();
通过Retrofit实例创建接口服务对象
Request request = retrofit.create(Request.class);
调用接口中的方法
Call<ResponseBody> call = request.get();
执行异步请求(同步请求需要创建一个新的线程去执行)
call.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
2. Retrofit封装
以上可以看出Retrofit是个好东西,可是用起来是比较麻烦的,所有在实际使用中对Retrofit进行一下小小的封装是很有必要的。
定义接口(所有的请求参数都是以map的形式)
public interface Request {
/**
* 不带参数的get请求
* @param url
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url);
/**
* 带参数的get请求
* @param url
* @param map 参数默认是map
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);
/**
* 不带参数的post请求
* @param url
* @return
*/
@POST()
Call<ResponseBody> post(@Url String url);
/**
* 带参数的post请求
* @param url
* @param map
* @return
*/
@POST()
@FormUrlEncoded
Call<ResponseBody> post(@Url String url, @FieldMap Map<String,String> map);
}
定义RetrofitManager,以单例模式获取Retrofit实例
public enum RetrofitManager {
/**
* RetrofitManager的实例
*/
INSTANCE;
/**
*
* 后端接口的baseUrl,且只考虑一个url的情况(ip+端口,或者域名)
*/
private static final String BASE_URL = " Your BASE_URL";
private Retrofit retrofit;
/**
* 返回Retrofit实例,不添加转换器
* @return
*/
public Retrofit getRetrofit(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.build();
}
return retrofit;
}
}
自定义的RetrofitCallback,在发送请求时,通过匿名对象作为参数获取后端的响应结果。
public abstract class RetrofitCallback {
/**
* 开始执行的方法
*/
public void onStart(){
//开启loading
}
/**
* 结束执行的方法
*/
public void onCompleted(){
//关闭loading
}
/**
* 执行成功
* @param resultJsonString 返回的json字符串
*/
public abstract void onSuccess(String resultJsonString);
/**
* 失败
* @param t 异常
*/
public abstract void onError(Throwable t);
/**
* 提示:服务异常
*/
public void serverErrMsg(){
//xxx
}
/**
* 提示:请求失败
*/
public void reqErrMsg(){
//xxx
}
/**
* 提示:成功
*/
public void okMsg(){
//xxx
}
}
定义RetrofitUtil,封装get和post方法。将RetrofitCallback作为请求参数,在发送请求时重写onSuccess和onError方法,执行具体的操作。
public class RetrofitUtil {
private Retrofit(){}
/**
* 无参的get请求
* @param url
* @param callback
*/
public static void get(String url, RetrofitCallback callback){
sendRequest(getRequest().get(url),callback);
}
/**
* 有参的get请求
* @param url 请求的url
* @param map 参数
* @param callback 请求结束的回调
*/
public static void get(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().get(url,map),callback);
}
/**
* 无参的post请求
* @param url
* @param callback
*/
public static void post(String url, RetrofitCallback callback){
sendRequest(getRequest().post(url), callback);
}
/**
* 有参的post请求
* @param url
* @param map
* @param callback
*/
public static void post(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().post(url,map), callback);
}
/**
* 获取Request实例
* @return
*/
private static Request getRequest(){
Retrofit retrofit = RetrofitManager.INSTANCE.getRetrofit();
return retrofit.create(Request.class);
}
/**
* 发送请求的共通方法,并对响应结果进行处理
* @param call
* @param callback 自定义的Callback
*/
private void sendRequest(Call<ResponseBody> call,RetrofitCallback callback){
//开启loading
callback.onStart();
//异步请求
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//关闭loading
callback.onCompleted();
if(response.isSuccessful()){
//执行RetrofitCallback的onSuccess方法,获取响应结果的json字符串
try {
String result = response.body().string();
callback.onSuccess(result);
//响应成功
if(StringUtils.equals(result, Constant.SUCCESS)){
callback.okMsg();
}
} catch (IOException e) {
e.printStackTrace();
}
}else{
//服务异常
callback.serverErrMsg();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
callback.onCompleted();
//请求失败
callback.onError(t);
callback.reqErrMsg();
}
}
});
}
}
3. RetrofitUtil使用
get无参请求
RetrofitUtil.get("/xx/xx", new RetrofitCallback() {
@Override
public void onSuccess(String resultJsonString) {
}
@Override
public void onError(Throwable t) {
}
});
get有参请求
Map<String,String> map = new HashMap<>(16);
map.put("key","value");
//xxx
RetrofitUtil.get("/xx/xx", map,new RetrofitCallback() {
@Override
public void onSuccess(String resultJsonString) {
xxxx
}
@Override
public void onError(Throwable t) {
xxxx
}
});
post请求和get的使用方法相似
最后
本次只对get和post进行了封装,项目中只用到了这些就没有对文件上传下载以及别的请求方式进行封装。且没有添加转换器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封装思路就是这样的,可以自行发挥。
此文也只是在记录项目中对Retrofit的使用,对Retrofit的原理并没有较深的了解。
来源:https://blog.csdn.net/java13245/article/details/122194971
0
投稿
猜你喜欢
- 对单机服务做接口限流的处理方案简单说就是设定某个接口一定时间只接受固定次数的请求,比如/add接口1秒最多接收100次请求,多的直接拒绝,这
- SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):cache – 对给定命名空间的缓存配置。cache-ref – 对其他命
- 跑起来的效果看每个类的test方法,自己调用来测试目的是看看哪个算法好用,移植的时候比较单纯没有研究懂算法,代码结构也没改动,只是移植到C#
- WPF中有一个DrawingContext类,该类提供了很多画法方法,例如DrawLine,DrawText,DrawRectangle等。
- 1.设置url-pattern为*.do(最为常见的方式)只要你的请求url中包含配置的url-pattern,该url就可以到达Dispa
- name和url属性的作用定义feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调
- 1、使用步骤1)构建请求网址A、确定端点:每个GIS服务都有一个端点。例如,ArcGIS Server上Demographics文件夹下名为
- #line #line 使您可以修改编译器的行号以及(可选)错误和警告的文件名输出。下面的示例说明如何报告与行号关联的两个警告。#line
- 关于SQLiteSQLite是一款轻型的嵌入式的遵守ACID的关系型数据库管理系统,诞生已有15个年头了。随着移动互联的发展,现在得到了更广
- 导入相关jar包1、junit<dependency> <groupId>junit</grou
- 如今APP越来越多,我们每天所使用的的软件也越来越多,可是在我们不付费的情况下,App制造商如何实现,实现收入甚至是盈利呢?答案就是在我们打
- 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应, 同时我们又需要在工作线程中更新UI界面上的控件。但直接访
- 一、策略模式到底是什么?策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替
- 本文实例为大家分享了Android自定义View实现拖动自动吸边的具体代码,供大家参考,具体内容如下自定义View,一是为了满足设计需求,二
- 1.概述在之前的博文中简单介绍过如何实现fragment之间的信息交互:《Android中Fragment与Activity之间的交互(两种
- 看如下代码#include "pch.h"#include <iostream>using namespac
- 实践过程效果代码public partial class Form1 : Form {
- 一、匿名结构体struct{ char name[20]; int age;}s1;匿名
- 前言在日常开发中,除了修改请求参数、设置响应header,响应body外,还有一种需求就是url重新,或者是修改url,这里简述一下怎么在z
- 1、如何添加listBox的值this.listBox1.Items.Add("张晓东");2、如何判断listBox集