最近做了一个项目其中有涉及通过token登陆验证的要求,为了加深印象,也为了有这方面需求的童鞋有个参考于是决定回头回顾一下这个过程
1、首先登陆页面通过先请求一个验证码,请求成功后通过返回体里面截取token供以后请求使用。
OkHttpClient client = new OkHttpClient();
//使用Gson将对象转换为json字符串
String json = new Gson().toJson(loginDataBean);
//MediaType 设置Content-Type 标头中包含的媒体类型值
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8")
, json);
Request request = new Request.Builder()
.addHeader("cookie", strCookie)
//提交验证 的url;
.url(Config.GET_PSW_TOKEN_URL)
.post(requestBody)
.build();
Call handleCode = client.newCall(request);
/**
* 请求验证码接口,返回cookie
*/
private void getPicture() {
mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url(Config.GET_LOGIN_VALID_CODE)
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
//失败的回调
@Override
public void onFailure(Call call, IOException e) {
Logger.e("errro");
}
//成功的回调
@Override
public void onResponse(Call call, Response response) throws IOException {
//刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
if (response.isSuccessful()) {
InputStream is = response.body().byteStream();
Bitmap bm = BitmapFactory.decodeStream(is);
mHandler.obtainMessage(0, bm).sendToTarget();
}
Headers headers = response.headers();
List<String> cookies = headers.values("Set-Cookie");
String session = cookies.get(0);
strCookie = session.substring(0, session.indexOf(";"));
}
});
}
2、而后通过携带账号密码和验证码参数一同请求登陆接口(通过okhttp3的网络框架,使用post提交json格式参数)
//请求加入调度
handleCode.enqueue(new Callback() {
//失败的回调
@Override
public void onFailure(Call call, IOException e) {
Logger.e("error" + e.getMessage());
}
//成功的回调
@Override
public void onResponse(Call call, Response response) throws IOException {
//刷新ui,okhttp网络请求后,不是在主线程中,如果要刷新ui,必须的主线程中;
if (response.isSuccessful()) {
//解析请求password接口后,的请求体中的token数据
String responseResult = response.body().string();
java.lang.reflect.Type type = new TypeToken<LoginResponseData>() {
}.getType();
LoginResponseData loginResponseDara = new Gson().fromJson(responseResult, type);
//进行从接口返回数据中的accessToken值进行base解码
SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), "ACCESS_TOKEN", loginResponseDara.getAccess_token());
SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(),
GlobalConstants.SP_SAVE_REFRESH_TOKEN, loginResponseDara.getRefresh_token());
String[] accessToken = loginResponseDara.getAccess_token().split("\\.");
String decodeToken = Base64Utils.decode(accessToken[1]);
// Logger.e(decodeToken);
//进行Base64解码后的json的解析,得到userName请求登录接口
java.lang.reflect.Type base64Type = new TypeToken<Base64DecodeBean>() {
}.getType();
Base64DecodeBean base64DecodeBean = new Gson().fromJson(decodeToken, base64Type);
SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), GlobalConstants.SP_SAVE_TOKEN_USERNAME,
base64DecodeBean.getUser_name());
// SharedPreferencesUtil.saveStringValue(MyApplication.getInstance(), GlobalConstants.SP_SAVE_HAVE_LOGINED,
// "1");//记录已经登陆过
LoginRequestUtil.doUserIdGet(base64DecodeBean.getUser_name());
getAccountId(mContext);
} else {//验证码输入有误
String errorResponse = response.body().string();
java.lang.reflect.Type type = new TypeToken<LoginErrorResponseBean>() {
}.getType();
LoginErrorResponseBean loginResponseDara = new Gson().fromJson(errorResponse, type);
mHandler.obtainMessage(1, loginResponseDara.getMessage()).sendToTarget();
}
}
});
说明:携带token使用post方法请求登陆,返回结果中取accessToken字段截取第二段,使用base64反解码得到userName字段请求用户数据<此处只是保存用户必要数据>,然后得到accountId字段后续使用
总结:以上就是整个请求的过程,整理的急希望以后有时间再完善一下,也希望同僚相互学习。喜欢的觉得有用的可以点一下喜欢,支持一下,嘻嘻