android开源库—retrofit(附实战源码)

  • 概述
  • 使用说明
  • 应用
  • 总结

1.概述

Retrofit是Square公司开发的一个类型安全的Android和Java的REST客户端库。

  • GitHub地址:https://github.com/square/retrofit
  • 官方使用说明:http://square.github.io/retrofit/

在介绍retrofit之前,先了解下RESTFUL风格:

RESTFUL:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
  • RESTful API设计指南:
    http://www.ruanyifeng.com/blog/2014/05/restful_api.html

在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEADER 和 OPTIONS。通过HTTP不同的RequestMethod来区分增删查改的行为。

2.使用说明

  • GET请求(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

(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);

3.应用

  • 添加依赖

在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();

4.总结

retrofit通过封装的请求接口创建的任一的Call都可以发起一个同步或异步的Http请求到服务器,解耦明确,使用简单。源码请参考下面的链接。

我将retrofit+rxjava+rxandroid+okHttp+mvp设计模式结合,和一些流行开源库写了一个简单的android基础开发框架。

  • GitHub地址:https://github.com/chunonesoft/BaseFramework

你可能感兴趣的:(android开发之路)