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有多个等:
- 携带的参数,用@Query;
- 替换网址的变量,用@Path;
- 具体的后续补充
添加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
- Retrofit知识点
- retrofit与okhttp知识点整理
- [Android 知识点] 网络请求框架Retrofit使用
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- cp mount分区文件
- Insight mvc:interceptor 解析、执行顺序
- 探索C++0x: 3. 右值引用(rvalue reference)
- ZMQ和MessagePack的简单使用(转)
- MFC之ListControl控件
- Retrofit知识点
- hdu 1005 找规律(好坑!!)
- Microsoft SQL Server 2008 基本安装说明
- Android String Reseourse format 格式化字符串问题
- apache kafka监控系列-KafkaOffsetMonitor
- POJ 1274-The Perfect Stall(二分图匹配/最大流问题)
- Python快速学习第二天
- 二叉树、二叉查找树
- Spring自动装配