Retrofit是Square公司开发的一个类型安全的Android和Java的REST客户端库。
在介绍retrofit之前,先了解下RESTFUL风格:
RESTFUL:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEADER 和 OPTIONS。通过HTTP不同的RequestMethod来区分增删查改的行为。
(1)GET请求
URL(无参数):http://192.168.191.1/api/users
@GET("Users")
Call getUser();
URL(有参数):http://192.168.191.1/api/users/{userid}
@GET("Users/{userid}")
Call getUser(@Path("userid") String userid);
URL(传统方式有参数):http://192.168.191.1/api/users?userid=1
@GET("users/{userid}")
Call getUser(@Query("userid") String userid);
URL(多个参数,且个数不确定):http://192.168.191.1/api/users?userid=1&username=chunsoft
@GET("Users/{userid}")
Call getUser(@QueryMap Map map);
(2)POST请求
URL(有一个数据):http://192.168.191.1/api/users/
@FormUrlEncoded
@POST("users")
Call postUser(@Field("userid") String userid);
URL(有多个数据):http://192.168.191.1/api/users/
@FormUrlEncoded
@POST("users")
Call postUser(@Body UserBean userbean);
(3)DELETE请求
URL:http://192.168.191.1/api/users/{userid}?username=chunsoft
@DELETE("users/{userid}")
Call deleteUser(@Path("userid") String userid,@Query("username") String username;
(4)PUT请求
URL:http://192.168.191.1/api/users/{userid}?username=chunsoft
@PUT("users/{userId}")
Call updateUsers(
(@Path("userId") String userid,@Query("username") String username),@Body UserBean bean);
在modul的build文件下dependencies中添加:
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
"android.permission.INTERNET"/>
(1)创建实体类
创建实体类接收客户端请求后服务端的返回
/**
* Developer:chunsoft on 2016/10/23 22:24
* Email:[email protected]
* Content:创建实体类
*/
public class FeedbackBean {
public String retcode;
public String retmsg;
public String userid;
}
(2)接口申明
/**
* Developer:chunsoft on 2016/10/23 22:06
* Email:[email protected]
* Content:URL接口申明
*/
public interface LoginModel {
@GET("users/login_get.do")
Call getLogin(@Query("username")String username,@Query("password")String password);
}
(3)创建一个retrofit对象
导入logging-interceptor日志系统,打印网络请求和返回
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Developer:chunsoft on 2016/10/23 22:27
* Email:[email protected]
* Content:创建一个Retrofit对象
*/
public class LoginNetwork {
public static Retrofit mRetrofit;
public static Retrofit getRetrofit(String baseUrl)
{
if (mRetrofit ==null){
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (true){
//HttpLoggingInterceptor是okhttp提供的日志系统,打印网络请求和返回,
// GsonConverterFactory转换器
//在创建service实例之前添加一个CallAdapter进Retrofit对象
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
}
OkHttpClient okHttpClient = builder.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
}
return mRetrofit;
}
}
(4)创建访问API的请求
LoginModel mLoginModel = LoginNetwork.getRetrofit(Api.BASEURL).create(LoginModel.class);
Call call = mLoginModel.getLogin(username,password);
(5)同步调用
FeedbackBean feedback = call.execute();
(6)异步调用
//Callback回调接口
public interface Callback<T> {
void onResponse(Response response);
void onFailure(Throwable t)
}
//异步请求
call.enqueue(new Callback(){
@Override
public void onResponse(Response response) {
//成功返回数据后处理,使用response.body()
FeedbackBean feedback = response.body();
}
@Override
public void onFailure(Throwable t) {
//返回失败在这里处理
}
});
(7)取消请求
call.cancel();
retrofit通过封装的请求接口创建的任一的Call都可以发起一个同步或异步的Http请求到服务器,解耦明确,使用简单。源码请参考下面的链接。
我将retrofit+rxjava+rxandroid+okHttp+mvp设计模式结合,和一些流行开源库写了一个简单的android基础开发框架。