Retrofit知识点

来源:互联网 发布:c语言编程入门书籍 编辑:程序博客网 时间:2024/06/05 17:53

使用前的配置

导入 compile ‘com.squareup.retrofit2:retrofit:2.1.0’(可以参考官方的文档)


在代码中的体现

一般会在工程的三个位置使用:xxxService,Application,xxxActivity;

  • xxxService:接口的类,里面定义访问接口的地址、携带的参数和访问的方式(POST/GET)
public interface xxxService{    @POST("../login.action")    Call<BaseMoudle> userLogin(        @Query("mobile") String phone    );}
  • Application:初始化Retrofit,并在这里保存xxxService对象,全局使用同一个
public class App extends Application{    public static xxxService mService;    @Override    public void onCreate() {        super.onCreate();        //定义缓存的大小        File httpCacheDirectory = new File(FileUtil.getAvailableCacheDir(),"文件的名称,可以自定义");        Cache cache = new Cache(httpCacheDirectory,20 * 1024 * 1024);        OkHttpClient okHttpClient = new OkHttpClient.Builder()                .cache(cache)                .addInterceptor(mInterceptor)                .build();        Retrofit retrofit = new Retrofit.Builder()                .baseUrl(BASE_URL)        .addConverterFactory(GsonConverterFactory.create())                .client(okHttpClient)                .build();        mService = retrofit.create(xxxService.class);    }}
  • xxxActivity:调用接口的地方,比如登录
App.mService.userLogin("130128...").enqueue(new Callback<BaseModule>(){    @Override    public void onResponse(Call<ArticleDetailModule> call, Response<ArticleDetailModule> response) {    //访问成功});     @Override    public void onFailure(Call<ArticleDetailModule> call, Throwable t) {        t.printStackTrace();        }

网址的不确定因素(网址的前缀切换、参数不确定等)

以这个网址举例,http://www.blog.com.userLogin.action?userPhone=12;正常情况下,访问后台的格式是这样的,而我们会遇到一些特殊的情况:?前面的路径不同,登录的时是userLoginAction,但是在注册的时候是Register.Action; 后面携带的参数不一样,userPhone有多个等:

  1. 携带的参数,用@Query;
  2. 替换网址的变量,用@Path;
  3. 具体的后续补充

添加header

header的添加分为两种,一个放在接口里,另外一种放在插值器里。
放在接口里面

@Headers({    "Accept: application/vnd.github.v3.full+json",    "User-Agent: Retrofit-Sample-App"})@GET("users/{username}")Call<User> getUser(@Path("username") String username);

放在插值器里

private Interceptor mInterceptor = new Interceptor() {        @Override        public Response intercept(Chain chain) throws IOException {            Request request = chain.request();            if(TextUtils.isEmpty(token)){                request = request.newBuilder().build();            }else{                request = request.newBuilder()                        .header("token",token)                        .removeHeader("Pragma")                        .build();            }            Response response = chain.proceed(request);            return response;        }    };    mInterceptor添加到OkHttpClient(参考上面的例子)

添加token以及过期自动刷新

private Interceptor mInterceptor = new Interceptor() {        @Override        public Response intercept(Chain chain) throws IOException {            Request request = chain.request();            Response originalResponse = chain.proceed(request);            if(TextUtils.isEmpty(token)){                request = request.newBuilder().build();            }else{                ResponseBody responseBody = originalResponse.body();                BufferedSource source = responseBody.source();                source.request(Long.MAX_VALUE); // Buffer the entire body.                Buffer buffer = source.buffer();                Charset charset = Charset.forName("UTF-8");                MediaType contentType = responseBody.contentType();                if (contentType != null) {                    charset = contentType.charset(Charset.forName("UTF-8"));                }                String responseStr = buffer.clone().readString(charset);                Log.i("", "intercept: "+responseStr);                if(tokenNeedRefresh(responseStr)){                    //需要刷新token                    token = refrershToken(getApplicationContext());                    if(!TextUtils.isEmpty(token)){                        request = request.newBuilder()                                .header("token",token)                                .removeHeader("Pragma")                                .build();                    }                    originalResponse.body().close();                    return chain.proceed(request);                }            }            return originalResponse;        }    };

http://www.jianshu.com/p/62ab11ddacc8

0 0
原创粉丝点击