cookie,session,token这三兄弟真令人头大,安卓里面是,flutter也一样。
但好在dio有定义好的cookie管理库
dio.interceptors.add(CookieManager(CookieJar()));
但是你知道的,有的后台cookie不知道会给你放在哪····而且要是用session和token就没办法了,这次遇到的问题是在 options的cookie属性里面加,并没有显示,最后只能加上拦截器,具体原因不明。直接上我网络请求的部分代码吧。
HttpUtil() {
//BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
options = new BaseOptions(
//请求基地址,可以包含子路径
baseUrl: Api.BaseUrl,
//连接服务器超时时间,单位是毫秒.
connectTimeout: 10000,
//响应流上前后两次接受到数据的间隔,单位为毫秒。
receiveTimeout: 5000,
//Http请求头.
headers: {
//do something
"version": "1.0.0",
"jsid":"qz"
},
//直接加cookie没有用
cookies: [Cookie("vue_admin_template_token",Global.profile.token!=null?Global.profile.token:"1111")],
//请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
contentType: ContentType.json,
//表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
responseType: ResponseType.json,
);
dio = new Dio(options);
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
// config the http client
client.findProxy = (uri) {
//proxy all request to localhost:8888
return "";
};
// you can also create a new HttpClient to dio
// return new HttpClient();
};
//Cookie管理,没有持久化保存,重开一次app就会重新去获取
// dio.interceptors.add(CookieManager(CookieJar()));
//添加拦截器
dio.interceptors
.add(InterceptorsWrapper(onRequest: (RequestOptions options) {
var op = options;
if(op.path.contains("login") || op.path.contains("verifyCode")){
}else{
op.headers.addAll({
"Authorization":"Bearer " + (Global.profile.token!=null?Global.profile.token:"1111")
});
options.headers[HttpHeaders.cookieHeader] = "vue_admin_template_token=${(Global.profile.token != null ? Global.profile.token : '1111')}";
}
print("请求之前"+op.cookies.toString());
return op; //continue
}, onResponse: (Response response) {
print("响应之前");
// Do something with response data
if(response.headers.toString().contains("JSESSIONID")){
print(response.headers);
}
return response; // continue
}, onError: (DioError e) {
print("错误之前");
// Do something with response error
return e; //continue
}));
}
简单说明一下Global是持久化保存数据的文件,flutter中文网上有详细的说明,请自行查看。这个也不太完整只有添加cookie,没有刷新cookie的操作,仅供参考。保存cookie是放在获取cookie接口的返回里面进行操作。