Retrofit响应数据及异常处理策略

今天我们来谈谈客户端对通讯协议的处理,主要分为三部分:约定响应数据格式,响应数据的自动映射以及错误处理三部分。

由于数据协议采用json的居多,因此我们在此基础上进行说明。

约定响应数据格式协议格式通常来说,你拿到的设计文档中会存在通信协议的说明,对于客户端来说,一个良好的通信协议需要能描述操作状态(操作码+操作提示)以操作结果,因此,常见的响应数据的格式如下:{"code": 0,"msg": "正常","data": {"id": 1,"account": "121313","accountName": "alipay","income": ""}}code定义code为我们自定义的操作状态码,首先来看我们常用的定义:msg定义msg为服务器端返回的操作信息。

无论操作成功与否,客户端都应该根据业务给出准确的提示,客户端则根据实际情况选择展示与否。

data 定义data则是请求返回的具体内容,通常data根据请求接口的不同最终会被解析成不同的实体类。

示例下面我们以获取消息列表和消息详情两个接口返回的响应数据作为示例:消息列表:{"code": 0,"data": {"list": [{"content": "你参加的活动已经开始了...","createtime": "2016-09-23 16:44:02","id": "4480","status": 0,"title": "活动开始","type": "1"},{"content": "你参加的活动已经结束...","createtime": "2016-09-19 14:30:02","id": "4444","status": 0,"title": "活动结束","type": "1"}],"total": 2},"msg": "正常"}消息详情{"code": 0,"data": {"detail":{"content": "你参加的活动已经开始了,请准时到你的活动中去执行", "createtime": "2016-09-23 16:44:02","id": "4480","status": 0,"title": "活动开始","type": "1"},},"msg": "正常"}响应数据映射实体数据模型当我们接受到如上格式的响应数据时,下面便是考虑如何应用的问题,也就是如何将协议转换?是在获取响应的时候自动转换还是手动转换?转换成Java实体类还是String?“偷懒”是程序员的天性,我们当然不希望花费时间在这种无创造性的工作上,所以我们考虑在收到响应的时候直接将其转换为java实体类。

确定了我们的目标之后,接下来,首要任务是对数据协议进行抽象?什么叫做数据协议抽象?所谓的数据协议抽象就是根据聚合性,通用性,隔离性三原则将整个数据协议进行切分复用,以便更好的映射成我们需要的数据模型。

我们对刚才约定的数据协议格式进行协议抽象后,可以拿到类似以下的实体模型:public class Result<T> {private int code;private String msg;private T data;set和get方法}Result做为所有响应模型的公共基类,其中的code,msg,data分别用来映射我们通信协议。

其中,泛型化的data确保接受不同的实体模型,可以看出,我们通过数据协议抽象之后,最终得到了一个良好的数据模型。

为了下面的需要我们一同将消息列表和消息详情的实体类放上来:public class message{private String content;private String createtime;private String id;private int status;private String title;private String type;set和get方法}public class messageList {private int total;private List<Message> list;set和get方法}现在来看看我们理想的获取消息列表和获取消息详情的接口应该是什么样的:@GET("/user/message/list")Call<Result<MessageList>> getMessageList(@Query("page") int page);@GET("/user/message")Call<Result<Message>> getMessage(@Query("mid") int mid);结合我们上面所述,我们希望每个api最后返回给我们的都是Resultprovided ''接下来是添加Converter依赖:最后为retrofit设置Converter:Retrofit retrofit = new ().baseUrl("").addConverterFactory()).build();GitHubService service = ;这样,我们的请求和响应由Gson进行处理:请求体(使用@Body)被映射成json,响应体被映射成实体数据模型。

上面我们谈到了通讯协议格式以及如何利用retrofit的Converter实现协议和实体之间的自动映射。

此时我们调用任何服务接口其使用大体如下,以获取消息列表接口为例:Call<Result<MessageList>> call = ().getMessageList(mCurrentPage * getPageSize(), getPageSize());(new Callback<Result<MessageList>>() {@Overridepublic void onResponse(Call<Result<MessageList>> call, Response<Result<MessageList>> response) {Result<MessageList> result = ();if ()) {1.1.01.1.02.0.2ddCallAdapterFactory())现在看引入RxJava之后接口的变化,同样还是以获取消息列表为例:引入之前:@GET("/user/message/list")Call<Result<MessageList>> getMessageList(@Query("start") int start, @Query("length") int length);引入之后:@GET("/user/message/list")Observable<Result<MessageList>> getMessageList(@Query("start") int start, @Query("length") int length);得益于retrofit良好的设计,加入对rxjava的支持对我们接口的影响非常之小。

自定义Converter统一错误处理我们对异常总是感觉麻烦,在客户端开发中,网络异常更是重中之重。

现在让我们回到开始,来看这段代码:().getMessageList(0, 10).subscribeOn()).observeOn()).subscribe(new Subscriber<Result<MessageList>>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {其结构非常简单:GsonConverterFactory,GsonRequestBodyConverter及GsonResponseBodyConverter,分别来看一下起源码:GsonRequestBodyConverter源码:照converter-gson结构,我们自定义custom-converter-gson:仿照GsonResponseBodyConverter编写MyGsonResponseBodyConverter:public class MyGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {private static final Charset UTF_8 = ("UTF-8");private final Gson mGson;private final TypeAdapter<T> adapter;public MyGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {mGson = gson;= adapter;}@Overridepublic T convert(ResponseBody value) throws IOException {String response = ();Result re = (response, ;ddConverterFactory())ddCallAdapterFactory())通过上面的改进,我们已经成功的将所有异常处理点转移至onError()当中了。

合集下载

retrofit 原理解析

retrofit 原理解析

retrofit 原理解析【最新版】目录1.Retrofit 简介2.Retrofit 的原理3.Retrofit 的使用方法4.Retrofit 的优势与不足正文【Retrofit 简介】Retrofit 是一个基于 OkHttp 的网络请求库,用于实现 Android 和 Java 平台的 RESTful API 客户端。

它提供了一种简单、可靠的方式来发起 HTTP 请求,使得开发者可以专注于 API 的设计和实现,而无需花费大量时间处理底层网络请求细节。

【Retrofit 的原理】Retrofit 的核心原理是使用 OkHttp 作为底层 HTTP 客户端,通过动态生成请求的 API 接口,将 OkHttp 中的 Request 和 Response 对象映射到具体的 Java 对象。

具体来说,Retrofit 主要通过以下几个步骤实现这一原理:1.定义 API 接口:开发者需要创建一个接口,用于描述 API 的请求方法、URL 和参数。

Retrofit 会根据这个接口生成对应的 Request 对象。

2.配置 Retrofit:开发者需要创建一个 Retrofit 实例,并传入 API 接口和 OkHttp 客户端。

Retrofit 实例会根据配置信息生成具体的请求对象。

3.发起请求:开发者可以通过 Retrofit 实例发起 HTTP 请求,Retrofit 会将请求信息传递给 OkHttp,并将响应结果返回给开发者。

【Retrofit 的使用方法】使用 Retrofit 的步骤如下:1.添加依赖:在项目的 build.gradle 文件中添加 Retrofit 和OkHttp 的依赖。

2.定义 API 接口:创建一个接口,并使用 Retrofit 的注解来描述请求方法、URL 和参数。

3.创建 Retrofit 实例:创建一个 Retrofit 实例,并传入 API 接口和 OkHttp 客户端。

retrofit的用法

retrofit的用法

retrofit的用法Retrofit 是一款用于 Android 平台的类型安全的HTTP 客户端,它的设计理念是简洁、易用、可读性好,不断引用着许多其他库的优势,从而成为了大家使用Android 网络请求的首选。

那么,本文将为大家介绍Retrofit 在 Android 中的使用方法和一些需要注意的细节,以便开发者快速、准确地对其进行应用。

## 1、基础环境和依赖在通过 Retrofit 进行网络请求时,我们需要事先导入相关的依赖库,包括网络请求所依赖的 OkHttp 库、由于 Retrofit 库本质上是基于反射的,所以还需要导入Retrofit 的反射库:```gradle implementation'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation'com.squareup.okhttp3:logging-interceptor:4.9.1'```其中,`converter-gson` 是用于数据解析的库,这在后面的请求部分中进行了详细解释。

`logging-interceptor` 库用于记录网络请求和响应时的日志信息,方便开发者进行调试。

## 2、请求定义在使用 Retrofit 进行网络请求时,我们通常需要先定义请求接口,这些请求接口对应服务端 API 接口的URL、请求方式、请求头、请求参数等信息。

定义请求接口时,开发者可以采用注解的方式来减少代码的编写,但是需要注意的是,Retrofit 中的每个注解都有其特定的作用,而且注解的用法和顺序对请求的参数以及请求方式有影响。

下面是一段 GET 请求接口的示例代码:```java public interface ApiService{ @GET("api/login") Call<User>login(@Query("username") String username, @Query("password") String password); } ```其中,注解`@GET`指定了 API 接口的请求方式为 GET请求,括号里面的字符串是接口路径。

retrofit gson 解析

retrofit gson 解析
它可以帮助开发者更容易地实现 RESTful API 的调用
网络请求:支持 GET、POST、PUT、DELETE 等多种请求方法
数据解析:支持 JSON、XML 等多种数据格式的解析
回调函数:提供 onResponse 和 onFailure 回调函数,方便处理请求结果
线程管理:支持异步和同步请求,自动管理线程
拦截器:提供拦截器机制,方便修改请求和响应
适配器:支持多种适配器,方便与不同网络框架集成
Retrofit 是一个用于处理网络请求的库,它使用注解来描述网络请求的参数、URL 和响应类型。
Retrofit 通过动态代理生成网络请求的接口实现,从而简化了网络请求的代码编写。
Retrofit 支持多种数据格式的解析,如 JSON、XML 等,可以通过 Gson、Jackson 等库进行解析。
Retrofit 使用 OkHttp 作为其底层网络库,负责处理实际的网络请求。
Gson 简介
Gson 是 Google 开发的一个 Java 库,用于将 Java 对象转换为 JSON 格式,以及将 JSON 格式转换为 Java 对象。
Gson 可以处理复杂的对象结构,包括嵌套对象、集合等。
解析响应数据,使用 Gson 转换器将 JSON 转换为对象
处理异常,如网络异常、解析异常等
感谢您的观看
Gson 提供了灵活的 API,可以自定义对象的序列化和反序列化过程。
Gson 的性能优秀,速度快,占用内存少。
将Java对象转换为JSON格式
支持自定义序列化器和反序列化器
支持多种数据类型的解析和转换
将JSON格式转换为Java对象
Gson 是 Google 开发的一个 Java 库,用于将 Java 对象转换为 JSON 格式,反之亦然。

flutter retrofit使用说明

flutter retrofit使用说明

flutter retrofit使用说明Flutter Retrofit是一款在Flutter框架下使用的网络请求库,它基于Dart语言的反射特性,提供了一种简单、快速、高效的方式来进行网络请求。

以下是关于如何使用Flutter Retrofit 的说明。

首先,你需要在pubspec.yaml文件中添加retrofit和retrofit_generator依赖。

```yamldependencies:retrofit: ^1.0.0retrofit_generator: ^1.0.0```然后,在你的项目根目录下执行以下命令来生成网络请求类。

```bashflutter packages pub run build_runner build```这将会根据你的定义,在`lib`文件夹下自动生成对应的网络请求类。

接下来,在你需要进行网络请求的地方,先导入生成的网络请求类。

```dartimport 'package:your_project_name/your_api_service.dart';```然后,实例化生成的网络请求类,并初始化一个Retrofit实例。

```dartfinal apiService = ApiService(Dio()); // 这里的Dio可以自行选择网络请求库final retrofit = Retrofit(apiService);```现在,你可以使用retrofit实例来发送网络请求。

```dartfinal response = await retrofit.getPosts();if (response.isSuccessful) {// 网络请求成功并得到响应final posts = response.body;// 根据响应数据进行处理} else {// 网络请求失败final error = response.error;// 根据错误信息进行处理}```需要注意的是,你需要在生成的网络请求类中定义请求的各种参数以及响应数据的解析方式。

详解RetrofitInterceptor(拦截器)拦截请求并做相关处理

详解RetrofitInterceptor(拦截器)拦截请求并做相关处理

详解RetrofitInterceptor(拦截器)拦截请求并做相关处理本⽂介绍Retrofit拦截器(Interceptor)的使⽤⽅法及相关注意事项。

如果本⽂对您有所帮助,烦请点亮⼩红⼼~⾸先看⼀下Interceptor源码:/*** Observes, modifies, and potentially short-circuits requests going out and the corresponding* responses coming back in. Typically interceptors add, remove, or transform headers on the request* or response.*/public interface Interceptor {Response intercept(Chain chain) throws IOException;interface Chain {Request request();Response proceed(Request request) throws IOException;/*** Returns the connection the request will be executed on. This is only available in the chains* of network interceptors; for application interceptors this is always null.*/@Nullable Connection connection();}}先看⼀下api描述,翻译过来其实就是可以通过拦截器拦截即将发出的请求及对响应结果做相应处理,典型的处理⽅式是修改header。

其实我们可能不仅要处理header,有时也需要添加统⼀参数,都可以在拦截器内部完成。

android retrofit用法

android retrofit用法

android retrofit用法Android Retrofit用法Retrofit是一个广泛使用的网络请求库,在Android开发中非常受欢迎。

它简化了与服务器进行通信的过程,提供了一种简单、灵活和高效的方式来处理网络请求。

下面是一些Android Retrofit的常见用法和详细的讲解。

1. 添加依赖库首先,在你的项目中添加Retrofit依赖库。

在你的文件中的dependencies块中添加以下代码:implementation ':retrofit:'请注意将”“替换为你需要使用的Retrofit版本号。

2. 创建网络请求接口接下来,创建一个接口来定义你的网络请求。

这个接口将包含你希望发送到服务器的所有请求。

public interface ApiService {@GET("users/{user}/repos")Call<List<Repo>> getRepos(@Path("user") String user); }在这个例子中,我们定义了一个名为getRepos的方法,该方法将使用GET请求获取指定用户的存储库列表。

@GET注释用于指定HTTP请求的类型和路径,@Path注释用于指定请求路径中的动态参数。

3. 创建网络请求实例接着,创建一个Retrofit实例来处理你的网络请求。

通常,在你的应用程序的某个单例类中创建并初始化Retrofit实例。

Retrofit retrofit = new ().baseUrl(".addConverterFactory(()).build();ApiService apiService = ();在这个例子中,我们使用Builder模式创建一个Retrofit实例。

我们指定了服务器的基本URL和要使用的转换器(这里我们使用Gson来将响应转换为Java对象)。

retrofit用法

retrofit用法Retrofit用法指南咱们来聊聊Retrofit这个超酷的东西。

你要是搞安卓开发,就知道它就像一把神奇的钥匙,能轻松打开网络通信的大门。

Retrofit是一个用于Android和Java的类型安全的HTTP客户端。

啥叫类型安全呢?就好比你去超市买东西,你得清楚你拿的是苹果还是香蕉,不能搞混了。

在网络通信里,类型安全就是让你清楚地知道你收到的数据是什么类型,不会稀里糊涂地处理。

先说说怎么把Retrofit引入到你的项目里。

这就像是邀请一位贵宾到你家做客,你得给人家安排好地方。

在Android项目里,你得在你的build.gradle文件里加上相应的依赖。

这一步可不能马虎,就像盖房子打地基一样重要。

要是这一步错了,后面的事儿就没法顺利进行了,那可就糟糕啦!创建Retrofit实例是很关键的一步。

这就好比你要开车出门,得先把车启动起来。

你得给Retrofit配置一个Base URL,这Base URL就像是车的导航起始点。

比如说,你要访问一个网站的很多不同页面,这个Base URL 就是这个网站的主地址,后面具体的请求就像在这个主地址基础上找不同的房间。

你要是把Base URL写错了,那就像你导航输错了起始点,车开出去也到不了正确的地方。

接口的定义在Retrofit里是个很有趣的部分。

你可以把接口想象成一个菜单。

你告诉Retrofit你想要什么服务,就像你在餐厅对着菜单点菜一样。

每个接口方法就对应着一个菜,每个方法的注解就像是对这道菜的特殊要求。

比如说,你可以用GET注解表示你要获取数据,这就像你跟服务员说你要一份凉拌黄瓜(这只是个比喻哈),凉拌黄瓜就是通过GET方式从厨房(服务器)获取到的。

再说说回调。

回调就像是你在餐厅等菜的时候,服务员告诉你菜做好了的那个通知。

在Retrofit里,当你发送一个网络请求后,它不会干等着,而是继续做其他事情。

等数据准备好了,就通过回调来告诉你。

retrofit 原理解析

retrofit 原理解析
Retrofit 是一个基于 Square 公司开发的 OkHttp 库的 RESTful
网络请求框架,它简化了 Android 开发中网络请求的复杂度。

Retrofit 的原理可以分为以下几个部分:
1. 注解解析:Retrofit 使用了注解来定义网络请求接口,如
`@GET`、`@POST` 等。

在编译时,Retrofit 会解析这些注解,并生成相应的网络请求代码。

2. 接口动态代理:Retrofit 使用动态代理技术生成网络请求接
口的实现类。

当应用调用网络请求接口的方法时,实际上是调用了动态代理类中的方法。

动态代理类会根据注解的信息构建具体的网络请求。

3. 请求构建:动态代理类根据注解中的信息,构建一个网络请求对象。

这个对象包含了请求的 URL、请求方法、请求头、
请求参数等信息。

4. 请求发送:Retrofit 使用 OkHttp 库来发送网络请求。

通过调
用 OkHttp 的 `newCall()` 方法,将构建的请求对象传递给OkHttp,然后通过 `enqueue()` 方法异步地发送请求。

5. 响应处理:OkHttp 发送请求后,会通过回调方法返回响应。

Retrofit 根据响应的内容,使用内置的转换器将响应数据转换
成 Java 对象,并将数据返回给应用。

总结起来,Retrofit 的原理就是通过注解解析和动态代理技术,
将网络请求接口转化为实际的网络请求对象,并使用 OkHttp 发送请求和接收响应。

这样可以使网络请求的使用变得简单和灵活,减少了开发的复杂度。

retrofit 参数

retrofit 参数摘要:I.简介- 介绍Retrofit 库- 阐述Retrofit 在Android 和Java 开发中的作用II.Retrofit 参数类型- 请求参数(Request Parameters)- 定义请求参数- 示例:使用请求参数的API 调用- 响应参数(Response Parameters)- 定义响应参数- 示例:使用响应参数的API 调用III.Retrofit 参数传递方式- 请求体(Request Body)- 定义请求体参数- 示例:使用请求体参数的API 调用- 请求头(Request Headers)- 定义请求头参数- 示例:使用请求头参数的API 调用- URL 参数(URL Query Parameters)- 定义URL 参数- 示例:使用URL 参数的API 调用IV.Retrofit 参数实战- 使用Retrofit 发送GET 请求并传递参数- 使用Retrofit 发送POST 请求并传递参数- 使用Retrofit 发送PUT 请求并传递参数- 使用Retrofit 发送DELETE 请求并传递参数V.总结- 回顾Retrofit 参数的相关内容- 强调Retrofit 参数在网络请求中的重要性正文:I.简介Retrofit 是一款强大的网络请求库,它基于Java 语言开发,适用于Android 和Java 平台。

Retrofit 可以帮助开发者轻松地实现网络请求,并简化API 的调用过程。

在Retrofit 中,参数的传递和处理是非常重要的一部分。

本文将详细介绍Retrofit 参数的相关知识,包括参数类型、传递方式以及实战应用。

II.Retrofit 参数类型Retrofit 参数主要分为请求参数和响应参数。

1.请求参数(Request Parameters)在Retrofit 中,请求参数可以通过在API 接口中定义参数类型和注解来完成。

详解Retrofit动态参数(非固定参数、非必须参数)(Get、Post请求)

详解Retrofit动态参数(⾮固定参数、⾮必须参数)(Get、Post请求)详解Retrofit 动态参数(⾮固定参数、⾮必须参数)(Get、Post请求)关键词:Retrofit 动态参数、⾮固定参数、⾮必须参数有如下场景:请求数据时:1. ⽤户未登录时,不带参数userId;2. 登录时带上参数userId.如下接⼝:@GET("index.php?r=default/homepage")Observable<Response<Exercise>> getDataList(@Query("page") int page);@GET("index.php?r=default/homepage")Observable<Response<Exercise>> getDataList(@Query("page") int page, @Query("user_id") int userId);两个接⼝,区别就在于有没有『user_id』参数。

这样做,总感觉有点罗嗦,体现不出Retrofit的优越性。

有没有更好的⽅法呢?当然有,那就是动态参数(其实很简单)。

上⾯的两个接⼝合并为⼀个:@GET("index.php?r=default/homepage")Observable<Response<Exercise>> getDataList(@Query("page") int page,@Query("user_id") Integer userId);使⽤登录:APIWrapper.getInstance().getDataList(mCurrentPage, 10);未登录:APIWrapper.getInstance().getDataList(mCurrentPage, null);Retrofit运⾏null值参数,如果在实际调⽤的时候传⼀个null, 系统也不会出错,会把这个参数当作没有。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档