用户登录流程详解 +volley(StringRequest)
在实习期间由于要求使用volley,所以第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各种资料,通过在项目中用到的实际问题,我想做一些总结,所以写了这篇文章。下面我将介绍我理解的用户登录的一套详细流程,涉及到volley请求以及json数据的解析。
登录流程的总结:首先通过EditText获取到用户名和密码,然后再执行登录请求 LoginToServer()里面发送用户名和密码,服务器返回给我json数据(如果用到Oauth 认证这里返回的json数据就应该是Token的一套东西,如果只是简单的登录,可以和服务器约定返回的内容,提取出对应的内容,包装起来做判断反馈给用户登录是否成功),我需要把这些json数据解析出来,然后再反馈给用户“登录成功”或者“登录失败”。
LoginActivity.class这里是在登录界面调用到 LoginToServer()这个方法,这里我把 User_Local.class 里面写了基本的set,get方法,然后是里面是全局(public static)的方法。
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_button:
if (checkEdit()) {
//这里记得一定要先get获得数据
User_Local.setUsername(username.getText().toString());
User_Local.setPassword(password.getText().toString());
// LoginToServer();
new LoginSupport(LoginActivity.this).LoginToServer();
}
break;
这里是User_Local.class ,首先这里为什么要写成public static,写成这种是说这是全局变量。全局的引用方法就是类名直接引用,不用再new 一个对象。比如这里就是引用直接就是上述的 User_Local.setUsername(username.getText().toString());。什么时候用全局的,什么时候不用,这个大家可以百度一下。比如在接受服务器传过来的json数据我要再建一套类去匹配解析,这个时候就不要用全局的。
public class User_Local {
public static String username = " " ;//用户名
public static String password =" ";//密码
public static String getUsername() {
return username;
}
public static void setUsername(String username) {
User_Local.username = username;
}
public static String getPassword() {
return password;
}
public static void setPassword(String password) {
User_Local.password = password;
}
LoginSupport.class 这个类里面我写了volley的登录请求,还有服务器返回的json数据解析(这里使用的是Gson来解析json数据),还有反馈给用户登录成功失败与否
volley请求简单说就三步:1.添加url地址。2.new 一个请求(请求里面有成功和失败的接口)3.添加请求到请求队列里面去
这里我只用了volley 里面的StringRequest这个请求,这个请求向服务器发送的应该是字符串吧,我理解的是这样的。然后至于volley的其他请求大家可以参考其他的博客和专业资料。
public void LoginToServer( ) {
String url = "http://XXXXX";//1.这里就是你要向服务器发送请求的地址
StringRequest loginRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {//2.new 一个请求
@Override
public void onResponse(String s) {//这里是返回正确反馈的接口(只要请求成功反馈的数据都这这里)
//数据处理反馈(可以这这里处理服务器返回的数据)
DealResponseFromServer(s);//json数据的解析和用户反馈
Log.i("TAG",s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//volley 有专门处理error的库,下面就是调用了其中的一些,可以方便调试的时候查找到错误
Log.d(TAG, "Volley returned error________________:" + volleyError);
Class klass = volleyError.getClass();
if(klass == com.android.volley.AuthFailureError.class) {
Log.d(TAG,"AuthFailureError");
Toast.makeText(context,"未授权,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.NetworkError.class) {
Log.d(TAG,"NetworkError");
Toast.makeText(context,"网络连接错误,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.NoConnectionError.class) {
Log.d(TAG,"NoConnectionError");
} else if(klass == com.android.volley.ServerError.class) {
Log.d(TAG,"ServerError");
Toast.makeText(context,"服务器未知错误,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.TimeoutError.class) {
Log.d(TAG,"TimeoutError");
Toast.makeText(context,"连接超时,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.ParseError.class) {
Log.d(TAG,"ParseError");
} else if(klass == com.android.volley.VolleyError.class) {
Log.d(TAG,"General error");
}
Toast.makeText(context,"登录失败",Toast.LENGTH_LONG).show();
}
})
{
//这里是添加请求头的地方重写了getHeaders() 方法(发送设么请求头要根据自己实际开发需要设定)
@Override
public Map<String, String> getHeaders() {
HashMap<String, String> header = new HashMap<String, String>();
header.put("Accept","application/json");
header.put("Content-Type","application/x-www-form-urlencoded");
return header;
}
//这里是发送参数的地方,重写了 getParams() 方法(传什么参数给服务器也是实际你自己修改)
@Override
protected Map<String, String> getParams() {
HashMap<String, String> map = new HashMap<String, String>();
//如果出现空指针异常或者是登录失败,先检查这里有木有传进来你要发送的用户名和密码。
//所以在执行get数据方法之前一定要先存数据(set方法)
map.put("username", User_Local.getUsername());
map.put("password", User_Local.getPassword());
return map;
}
};
//设置超时重新请求
loginRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//设置标签,方便在stop(){}里面取消对应的volley 请求
loginRequest.setTag("POST");
//3.把请求添加到全局请求队列里面
MyApplication.getHttpQueue().add(loginRequest);
}
//建立一个全局请求队列
public class MyApplication extends Application {
public static RequestQueue requestQueue;// @Override
public void onCreate() {
super.onCreate();
requestQueue = Volley.newRequestQueue(getApplicationContext());
} public static RequestQueue getHttpQueue(){
return requestQueue;
}
}
Gson解析json数据的精华就是:
gson.fromJson(就是把json数据解析成普通数据)和gson.toJson(把普通数据转化成json类型的数据格式)
要注意的是,这里解析到服务器的数据必须有一套模型和服务器里面的各种数据类型匹配,也就是你需要根据传过来的json数据建一个类来把解析的数据保存起来。
//解析服务器返回的json字符串反馈给用户
public void DealResponseFromServer(String s) {
Gson gson = new Gson();//第一步,实例化
User_Service user_service = gson.fromJson(s, User_Service.class);//第二步,解析数据
if (s!=null) {//这里的s就是上面成功回调接口里面的参数
//这里我保存了从服务器返回的token的信息,至于token就涉及到oauth2.0的内容了,不懂得可以百度,
//当然这里可以保持你需要保存的服务器返回的数据
PreferenceUtils.setPrefString(context,User_Service.userKey, "access_token", user_service.getAccess_token());//保存令牌(这里我用的是自己写的一套SharedPreferences的工具类来保存token)
PreferenceUtils.setPrefString(context,User_Service.userKey, "refresh_token", user_service.getRefresh_token());//保存刷新令牌
Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show();//反馈给用户登录成功
}
}
这个就是用于接收服务器返回的json数据类型所建立的类,专门用于解析json数据的。这里的变量就不用设置成全局的变量。
这里面的关系我捋一下,1.从服务器解析的json数据保存到本地数据库里面2.然后本地需要调用数据的时候,再去数据库里面去取。
//用于接收解析服务器返回数据所给的数据
public class User_Service {
public static final String userKey = "user_service";//用于保存服务器端传回的数据文件
private String access_token;//令牌
private String refresh_token;//刷新令牌 public String getAccess_token() {
return access_token;
} public void setAccess_token(String access_token) {
this.access_token = access_token;
} public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
} public String getRefresh_token() {
return refresh_token;
}
用户登录流程详解 +volley(StringRequest)的更多相关文章
- SCP免密传输和SSH登录流程详解
SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...
- 二维码闪电登录流程详解,附demo(1/2)
二维码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设 ...
- 二维码闪电登录流程详解,附demo(2/2)
上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作. TV主要完成二维码图片显示,以及websocket请求.下面重点说一下这两点. 1. B ...
- uniapp登录流程详解uni.login
uni.login(OBJECT)登录 H5平台登陆注意事项: 微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见普通浏览器上实现微信登陆,并非开放API,需要向 ...
- vsftp虚拟用户登录配置详解
一.安装:1.安装Vsftpd服务:# yum install vsftpd 2.安装DB4部件包:这里要特别安装一个db4的包,用来支持文件数据库.# yum install db4-utils 二 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- Linux 用户及权限详解
Linux 用户及权限详解 用户 , 组 ,权限 安全上下文(secure context): 权限: r,w,x 文件: r : 可读,可以使用类似cat 等命令查看文件内容. w : 可写,可以编 ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- unity3d-配置Android环境,打包发布Apk流程详解
31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...
随机推荐
- 【AngularJS】—— 7 模块化
AngularJS有几大特性,比如: 1 MVC 2 模块化 3 指令系统 4 双向数据绑定 那么本篇就来看看AngularJS的模块化. 首先先说一下为什么要实现模块化: 1 增加了模块的可重用性 ...
- Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记
Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.8.0/1.4.7 + MySQL 5.6.26 笔记,主要是给自己的PC机安装,非生产环境! 一.下载必要的源码 1.1.下 ...
- MAC地址,使用java获取IP地址和MAC地址。
MAC地址,通常在http连接的项目中,来区分唯一客户端. MAC:六组十六进制字符组成. 如:E0-3F-49-AB-DB-EB IP:四组八位的二进制字符组成. 如:10.6.62.244 /** ...
- HDU 1064 Financial Management
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1064 解题报告:用来凑个题数吧,看题的时间比过题的时间多的多,就是输入12个浮点数,然后输出平均数,只 ...
- iOS开发——UI基础-Xcode资源拷贝
#1.拷贝资源的时候选择的copy的含义: 是否要将资源拷贝一份到项目中, 如果不勾选就代表着不拷贝, 那么原来的资源不见了, 项目中的也不能用了 注意: 1.虽然项目中的图片和外部的图片是同一张图片 ...
- X.Org可能将失去它的域名x.org
X.Org基金会面临失去它的一个重要资产:单字母域名x.org.过去半年里,围绕着x.org域名的所有权问题,X.Org基金会董事会尝试私下解 决,但未能如愿.域名将于1月19日过期,只剩下不到两周的 ...
- python 字节与字符串转换
name = 'laogaoyang' nameBytes = name.encode('utf-8') # 字节 nameStr = nameBytes.decode('utf-8')# 字符串 p ...
- Android自定义标题栏
预览一下效果: 素材: 新建一个布局title_bar.xml,代码如下: <?xml version="1.0" encoding="utf-8"?&g ...
- mysql 之基本操作
已经在板子内部把所有的环境都搭好了,现在的要求是对Mysql 进行一些基本的操作. 在这之前,记录几个要点以防以后忘记. 一,准备工作. 1. 将usr/share/mysql 目录下的 my-lag ...
- 可复用View的PagerAdapter
用PagerAdapter的时候会反复调用instantiateItem和destroyItem来创建和销毁View,没有复用性.这里封装了一个可复用View的PagerAdapter,给实现类留下的 ...