关于Android的post,get、cookie网络获取的一些坑

这篇文章主要整理下关于我这几天的开发心得,还有这几天开发过程出现的bug以及修复过程,同时分享给大家,这是我的第二篇博客,写得较杂,请见谅

转载请注明出处:http://blog.csdn.net/ufo3127586/article/details/51493228

这几天做一个关于Android获取网络资源(查询教务系统成绩)的小项目,获取的是我们学校官网的教务系统,用的是正方教务系统,可惜里面有验证码。

地址:http://jwc.gdcxxy.net/

曲折的验证码登录

开始准备弄的时候思路好乱,不知道从哪开始,但既然开始还是得继续啊!

我们首先需要在Andorid模拟输入用户名和密码,验证码后登陆,获取网页信息,如果用Android官网原生的httpclient类可能效率太差了,所以通过网络搜索发现原来网上有现成的开源库,刚开始我是在 郭霖 的博客里介绍的Volley框架,没想到用起来还蛮溜,就简简单单那几行代码,没到想就能获取到网络图片

一些取自郭神的代码:取出

`RequestQueue mQueue = Volley.newRequestQueue(context);     StringRequest stringRequest = new StringRequest("http://www.baidu.com",                              new Response.Listener() {                                  @Override                                  public void onResponse(String response) {                                      Log.d("TAG", response);                                  }                              }, new Response.ErrorListener() {                                  @Override                                  public void onErrorResponse(VolleyError error) {                                      Log.e("TAG", error.getMessage(), error);                                  }                              });     mQueue.add(stringRequest);  `

具体可以去郭霖的博客参考,然后学会怎么使用后我高兴的把这个框架用到我的项目里去,我首先写好界面
就个学号、密码和验证码输入框,再加个验证码图片,图片由教务系统的验证码链接获取而来,开始还蛮顺利的,获取到网页信息,可以获取到教务系统的首页,但问题是我填写好信息,点击登录,输出的总是让我登录的状态。

  • 其中点击登录输出源码信息,发现输出的源码信息跟我和官网上用浏览器输出的信息咋不一样呢, 我用的Log.e输出来的,结果他把第一个红色框开始下面所有数据都不见了。后来我用Java的System输出,虽然可以输出第一个红框的内容,但是下面的验证码一直出不来是否正确的错误提错。后来好像添加了post的方法添加了 Host 好像就可以了,也不清楚后来!
  • 第二个问题就是能够出来错误提示的后,我试着登录但是不知道为什么总是显示 验证码错误提示 一直试下好多次,在自己浏览器可以啊,这个问题后来还是没有解决,如果就搁置了下。

没想到还没开始,就碰到这么多,真是没有料想到,整整花了一天无功而返,后来我逛了逛 张鸿洋 的博客时候偶然发现另外一个网络框架OkHttp3,里面还有鸿神封装好的 OkHttp-utils 框架 ,我就想不会是框架的bug吧,就突发奇想,把我项目里用的Volley框架代码全都改为OkHttp3,没想到惊呆了,真的好方便,用起来更6了,而且最重要的是我的项目终于可以成功登陆了(可以跳转到个人信息页面了) 真是6666,可以说有种发现新大陆的感觉

一个Cookies自动管理引发的血案

这个标题虽然取得有点夸张,但是这几天弄这个Cookies自动管理真是烦死我了,开始其实我cookies之前了解过一点,但是我自己只是了解了表面,没有真是去摸清原理,也导致这几天的误打误撞,今天才刚刚搞定。

开始我先是搜索关于Cookies的一些资料,大体上就是说,当你访问一个网址,用get或post时,服务器马上返回个Cookies给你,如果你用电脑浏览器的话,你的浏览器会帮您保存在一个指定的位置存储这些Cookies,有些是封装起来的,不让你查看,我看Uc浏览器 找了后发现个封装起来,不知道怎么打开就没试了,后来知道原来用火狐浏览器可以很方面的找个每个网站存储的Cookies,而且是分组显示的,一目了然。 ,当你再次打开那个网址的时候,它的服务器就会在它自己服务器寻找你的这个Cookies 进行比对,看有没有一样的,如果就一样的它就会返回你的个人信息给你,这样你就可以免登陆进行操作了。

估计看到这里你们肯定有疑问了,如果打开网站后服务器会给你个cookies,并且下次登陆时就进行比对,那如果我没有登陆过,但是我们的浏览器还是记下Cookie,如果是和别人一样的,它是不是会给我别人的账号信息(后来发现我是想多了,因为每个用户的Cookie是都是一长串的,不可能一样的),其实是这样的,当你登录你的账号进去后,它会把你账号和Cookie信息绑定在一起 并且存到它的服务器或者数据库里,如果登录失败它就不会绑定,反过来如果你按了退出登录时,我们就可以想到服务器会自动帮我们的Cookie接触关系,当我们下次再进入那个网站时,首先看你数据库有没有以前的你留下的Cookie,有的话就把你自己的信息反馈给您(ps:以上是我参考别人的资料,和这几天自己思考,碰壁后,多次试验得到的结果,可能不全正确,毕竟我也没认真学过cookie这些,难免会有些出错。)

竟然大概了解了原理,那就赶快动手试下吧,应用到我的项目中来,这里先说明下,我发现了 比如:就算访问一个验证码图片它也会返回个Cookie给你。但是有个问题,怎么试下Cookies是否自动管理呢(就算试下能不能带cookie去访问),在里面先说下我的这个项目 它是先通过首页登录,登录成功后会跳转到另一个页面,里面就我的各种信息,成绩,课程表之类。

所以要测试是否带cookies是否有效,只需要测试get访问你的个人信息页面的网址,看它会返回给你什么信息,如果成功带cookie过去了,就能显示信息,否则会打不开网址,(它会一直反馈 状态码 state 302 循环跳转),然后当我要用的时候发现原来OkHttp-Util这个封装框架里面已经包含了自动管理cookie的功能,get 或 post时都会把cookie保存下来,根本不用自己取出cookie,在发出来,连代码都不用写。

但是问题来了,当我退出App再进入的时候我发现,不能get访问个人信息页面,难道我关闭了App Cookie也一样清除掉了吗,后来弄了很久发现真的是如此,我找了很多资料,找到一款可以真机抓包的软件 Fiddle4这款软件真tm好用我,可以查出你手机访问的各种网络,并且连发出去 post get header 各种头文件和发送出去的数据也能显示出来。然后我就心血来潮,赶紧测试我的项目,惊呆的发现cookie原来没有发出去,这是怎么回事。

我在网络上又搜索了一通,去[鸿神的OkHttp-Utils Git]https://github.com/hongyangAndroid/okhttp-utils/issues/142—-[issue2]https://github.com/hongyangAndroid/okhttp-utils/issues/142 的issue焕然大悟原来,鸿神的文档说明里面明确说明了

默认cookie存储在内存中,可以通过OkHttpUtils.getInstance().getCookieStore().get(uri)获取cookies.

原来OkHttp3自动管理cookie管理 默认为把数据存在了内存,没有放在本地,所有当你再次开启App是没方法 带Cookie get或者post 发送出去的。 在这上面真是着实踩了一次坑。

后来在git的issue2找到了持久化Cookie的方法,开始不是用鸿神的OkHttp-Util封装里面的持久化Cookies是有bug的,因为当一个次访问你的网址时,它会把取出cookie并存储到本地(用的是sharepreference 方法),没想到每次启动都保存都会出错,并且在项目包名里也没有sharepreference保存的键值对,后来改了很久,一直以为是我代码哪里写错了,直到隔天,我再次上鸿神的git仓库的issue找问题(不得不说有时候框架有问题或报错了,要多看issue里的问题,通俗的说里面有点像国际版的stackoverflow,中国的csdn,有很多大神集结在里面,多多少少找到你想到的问题,不过注意有些问题会被close,因为解决问题了的问题,所以关闭了,要注意一下

然后在issue另一个大神的帮助下,修复了框架里的一段小代码,终于可以成功持久化cookie 管理了。

自此Android登录和Cookie 算是告一段落了,虽然这是个小小功能,没想到涉及到这么多知识点,也是我想不到的,然后把我的经验,或者说是开发中出现的坑和解决历程分享给大家,先让好好休息一下,为下一个项目功能做充足的准备

更多相关文章

  1. android proc 进程信息解析
  2. 带阻尼回弹效果的RecyclerView
  3. Android(安卓)bsdiff 实现增量更新
  4. Android(安卓)ORM 数据库的使用
  5. Android(安卓)4.0 4.2 不能显示电池使用信息
  6. afinal logo Android的快速开发框架 afinal
  7. Android(安卓)LogCat使用详解
  8. [Android(安卓)开源项目学习]Android的UITableView(1)
  9. Android(安卓)开源照相和图片选择框架PictureSelector

随机推荐

  1. Android屏幕适配出现的原因
  2. (五)Android线程及其消息机制
  3. Android——启动过程详解
  4. Android 系统HAL 简介
  5. [Android--Tool]Android如何将他人的代码
  6. android 笔记 ---- 使用Hessian与Java服
  7. Android样式的开发:shape篇
  8. Android(安卓)multidex 使用 与 实现原理
  9. [置顶] 【电子书下载】《Android应用程序
  10. Android 中的Parcelable序列化对象