最近一直在使用玩android开放的API做一个项目,在收藏接口的时候遇到了问题,登陆成功后在点击收藏还是提示未登录,然后慢慢接触到了cookie
此项目的接口数据来源于玩Android
思路:
使用postman模拟请求数据登录之前我们可以看到Temporary Headers中有一个Cookie字段,现在的值就是默认显示的内容
当我们登录成功后cookie字段的内容为:
可以看到postman帮我们报存了cookie中的内容,这样当我们进行收藏等操作的时候就可以操作成功,但是android中不会自动将cookie进行报存
直接进入主题:
@FormUrlEncoded
@POST("user/login")//登录接口数据
fun logintext(@Field("username") username:String,@Field("password") password:String):rx.Observable<Response<LoginBean>>
主活动代码:
private void onClick(View v) {
final String address = "https://www.wanandroid.com/";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(address)//基础URL 建议以 / 结尾
.addConverterFactory(GsonConverterFactory.create())//设置 Json 转换器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//RxJava 适配器
.build();
API workPlaneService = retrofit.create(API.class);
workPlaneService
.logintext("yuhang66", "123456")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Response<LoginBean>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i("eraaa", e.toString());
}
@Override
public void onNext(Response<LoginBean> loginBeanResponse) {
Headers headers = loginBeanResponse.headers();//我们通过Response的headers对象获取到响应头信息。
List<String> values = headers.values("Set-Cookie");//通过“Set-Cookie”字段获取到服务器返回的Cookie信息
for (String s : values) {
Log.e("ohmys", s);
}
Log.e("ohmys", "@" + values);//这里responseBodyResponse.body()获取的就是ResultBean对象
initText(values);//登录成功后 发起收藏页面的请求
}
});
}
private void initText(final List<String> values) {
new Thread(new Runnable() {
@Override
public void run() {
//这是一个查询产品详细信息的接口
FormBody contentBody = new FormBody.Builder()
.add("id", "2334")
.build();
//将cookie信息放到请求头中去
Request contentRequest = new Request.Builder()
.url("https://www.wanandroid.com/lg/collect/1165/json")
.header("Cookie", values.toString())//添加cookie
.post(contentBody)
.build();
okhttp3.Call contentCall = client.httpClient.newCall(contentRequest);
try {
okhttp3.Response contentResponse = contentCall.execute();
String contentResult = contentResponse.body().string();
Log.d("lalala", contentResult);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
这样就可以收藏成功了
要将cookie进行持久化的话 你可以使用SharedPerference等其他方法进行报存到android中