最近忙于公司的项目,一直没有更新博客,趁着空余的时间想做一个小项目,也顺便巩固下Android知识点,思来想去借助着鸿洋的玩Android 开放API,从头到尾的开发一遍,看看自己写的和别人的差距有多少。
做到获取收藏接口的时候,发现请求的数据需要传递Cookie信息,就是指用户在登录成功后,服务端会返回Cookie,里面包含用户的登陆状态信息等,这样用户在访问自己的收藏列表时,加上这个Cookie,那么就可直接获取到文章列表,如果没有Cookie,那服务端就不知道你是要获取哪个用户的文章列表。
那么接下来就要在登录或者注册成功时,将账号密码做cookie持久化操作即可
https://www.wanandroid.com/user/login
方法:POST
参数: username,password
收藏文章列表接口:
https://www.wanandroid.com/lg/collect/list/0/json
方法:GET
参数: 页码:拼接在链接中,从0开始。
文章中网络请求封装的Retrofit,底层是通过Okttp实现的,通过Okhttp中的Interceptor拦截器来设置请求头,然后通过retrofit.client(okhttpclient)对请求头进行修改,这样就省去了我们手动添加请求头的步骤。
这里我们创建两个拦截器,一个用于登录时接收Cookie保存在本地,另一个拦截器用于访问时在请求里添加Cookie。
1、首先设置注册或登录后获取到本地拦截的cookie信息
通过循环将Cookie信息放入到HashSet集合中
然后通过SharePreference将Cookie信息保存在本地
class ReceivedCookiesInterceptor implements Interceptor {
Context context;
public ReceivedCookiesInterceptor(Context context) {
super();
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
//这里获取请求返回的cookie
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();
for(String header: originalResponse.headers("Set-Cookie"))
{
cookies.add(header);
}
//保存的sharepreference文件名为cookieData
SharedPreferences sharedPreferences = context.getSharedPreferences("cookieData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putStringSet("cookie", cookies);
editor.commit();
}
return originalResponse;
}
}
2、添加本地Cookie进行网络访问的拦截器
从Sharepreference中读取Cookie并添加到头部
class AddCookiesInterceptor implements Interceptor {
Context context;
public AddCookiesInterceptor(Context context) {
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
HashSet<String> perferences = (HashSet) context.getSharedPreferences("cookieData", Context.MODE_PRIVATE).getStringSet("cookie", null);
if (perferences != null) {
for (String cookie : perferences) {
builder.addHeader("Cookie", cookie);
}
}
return chain.proceed(builder.build());
}
}
3、创建OkHttpClient对象,登录时拦截cookie信息
设置连接,读写超时时间,设置网络拦截器,调用接收和添加cookie的拦截器
OkHttpUtil(Context context,int connectTimeOut, int writeTimeOut, int readTimeOut) {
this.context = context;
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(connectTimeOut, TimeUnit.SECONDS)
.writeTimeout(writeTimeOut, TimeUnit.SECONDS)
.readTimeout(readTimeOut, TimeUnit.SECONDS);
builder.addNetworkInterceptor(new StethoInterceptor());
client = builder.addInterceptor(new ReceivedCookiesInterceptor(context)).build();
okHttpClient = builder.addInterceptor(new AddCookiesInterceptor(context)).build();
}
4、创建Retrofit对象
设置baseurl,gson转换器等
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpUtil.getClient())
.client(okHttpUtil.getOkHttpClient())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
5、创建业务接口类实例对象,create方法内部实际上是用动态代理的方式帮助我们创建了实例对象
anInterface = retrofit.create(RetrofitInterface.class);
6、得到请求的封装对象,包含注解的信息,就是url和参数信息
Call<HotKeyBean> call = anInterface.myCollect(page);
7、执行异步请求对象
call.enqueue(new Callback<HotKeyBean>() {
@Override
public void onResponse(Call<HomeListBean> call, Response<HomeListBean>response)
{
List<HomeListBean> data = response.body().getData();
}
@Override
public void onFailure(Call<HotKeyBean> call, Throwable t) {
Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
});
以上就是全部的内容了,欢迎小伙伴留言讨论,希望这篇文章对于需要cookie持久化操作的你有所帮助!