Android网络请求框架Retrofit详解
介绍:
Retrofit 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求。本文使用Retrofit2.0.0版本进行实例演示。
使用Retrofit可以进行GET,POST,PUT,DELETE等请求方式。
同步请求:需要在子线程中完成,会阻塞主线程。
Response response = call.execute().body();
异步请求:请求结果在主线程中回调,可以在onResponse()回调方法进行更新UI。
call.enqueue(Callback callback)
使用步骤:
(1) 创建工程,添加jar:
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0' //这两个jar版本要一致,否则会有冲突
(2) 创建业务请求接口,具体代码如下
/**
* 创建业务请求接口
*/
public interface IUserService {
/**
* GET请求
*/
@GET("Servlet/UserServlet")
Call<User getUser(@Query("email") String email);
/**
* POST请求
*/
@FormUrlEncoded
@POST("UserServlet")
Call<User postUser(@Field("name") String name, @Field("email") String email);
}
解释说明:
@GET注解表示GET请求,@Query表示请求参数,将会以key=value(@Query注解参数名称为key,调用传进来的值为value)的方式拼接在url后面.
@POST注解表示POST请求,@FormUrlEncoded将会自动将请求参数的类型设置为application/x-www-form-urlencoded,@FormUrlEncoded注解不能用于Get请求。@Field注解将每一个请求参数都存放至请求体中,还可以添加encoded参数,该参数为boolean型,具体的用法为: @Field(value = “password”, encoded = true) String pwd encoded参数为true的话,key-value-pair将会被编码,即将中文和特殊字符进行编码转换.
(3)创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
IUserService iUserService = retrofit.create(IUserService.class);
解释说明:
baseUrl()方法制定网络请求的固定绝对地址,一般包括请求协议(如Http)、域名或IP地址、端口号。 创建Retrofit实例时,若没有配置addConverterFactory(GsonConverterFactory.create())将会回调出JSON字符串,配置了将会回调实体对象。
支持的JSON解析库:
Gson: compile ‘com.squareup.retrofit2:converter-gson:2.0.1′ Jackson: compile ‘com.squareup.retrofit2:converter-jackson:2.0.1′ Moshi: compile ‘com.squareup.retrofit2:converter-moshi:2.0.1′ Protobuf: compile ‘com.squareup.retrofit2:converter-protobuf:2.0.1′ Wire: compile ‘com.squareup.retrofit2:converter-wire:2.0.1′ Simple XML: compile ‘com.squareup.retrofit2:converter-simplexml:2.0.1′ Scalars (primitives, boxed, and String): compile ‘com.squareup.retrofit2:converter-scalars:2.0.1′
(4) 调用请求方法,并得到Call实例
Call<ResponseBody call = iUserService.getUser(xing-java@foxmail.com);
(5) 使用Call实例完成同步或异步请求
/**
* 发送GET请求
*/
private void getRequest() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
IUserService iUserService = retrofit.create(IUserService.class);
Call<User call = iUserService.getUser("xing-java@foxmail.com");
call.enqueue(new Callback<User () {
@Override
public void onResponse(Call<User call, Response<User response) {
Log.i("MainActivity", "response = " + response);
User user = response.body();
resTxtView.setText(user.toString());
}
@Override
public void onFailure(Call<User call, Throwable t) {
}
});
}
请求方式:
(1)GET 请求:
GET 请求返回 JSON 字符串:
GET 请求返回实体对象:
(2) POST发送表单:
/**
* 发送POST请求
*/
private void postRequest() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
IUserService iUserService = retrofit.create(IUserService.class);
Call<User call = iUserService.postUser("star.tao", "xing-java@foxmail.com");
call.enqueue(new Callback<User () {
@Override
public void onResponse(Call<User call, Response<User response) {
}
@Override
public void onFailure(Call<User call, Throwable throwable) {
}
});
服务端接收到的结果:
(3)文件上传:
private void uploadFile() {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Constant.BASE_URL)
.build();
IUserService iUserService = retrofit.create(IUserService.class);
File file = new File("/sdcard/s.png");
RequestBody fileRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("upload_file", file.getName(), fileRequestBody);
String desc = "this is file description";
RequestBody descRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), desc);
Call<ResponseBody call = iUserService.uploadFile(descRequestBody, multipartBody);
call.enqueue(new Callback<ResponseBody () {
@Override
public void onResponse(Call<ResponseBody call, Response<ResponseBody response) {
Log.i("debug", "upload success");
}
@Override
public void onFailure(Call<ResponseBody call, Throwable t) {
}
});
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- Java多线程详解6【面试+工作】
- MySQL备份恢复第二篇(r5笔记第6天)
- SpringMVC 中配置 Swagger 插件.
- MySQL和Oracle对比学习之事务(r5笔记第4天)
- 【面试宝典】Java如何打印数组
- MySQL数据导入导出牛刀小试(r5笔记第3天)
- SpringMVC 异常处理.
- 一条简单的sql在11g和12c中的不同(r5笔记第2天)
- 浅析 SpringMVC 原理和配置.
- 使用impdp不当导致的数据丢失问题(r5笔记第1天)
- MySQL数据库 Event 定时执行任务.
- Tomcat 日志分割.
- crontab导致的频繁发送邮件的问题(r5笔记第20天)
- 再学习之Spring(依赖注入).
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android流式布局FlowLayout详解
- Linux 专题
- Go语言实现UDP通信
- Android多渠道打包的方法步骤
- Android编程实现压缩图片并加载显示的方法
- Android串口通信封装之OkUSB的示例代码
- Android 中Activity 之间传递参数
- Android开发简单实现摇动动画的方法
- Android 中menu同时显示图标和文字的实现
- android基于SwipeRefreshLayout实现类QQ的侧滑删除
- PopupWindow自定义位置显示的实现代码
- Bootstrap 下拉菜单.dropdown的具体使用方法
- Android访问assets本地json文件的方法
- Android延时操作的三种方法
- 5步教你快速写一个android Router路由框架