关于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<String>() {  @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 算是告一段落了,虽然这是个小小功能,没想到涉及到这么多知识点,也是我想不到的,然后把我的经验,或者说是开发中出现的坑和解决历程分享给大家,先让好好休息一下,为下一个项目功能做充足的准备

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

  1. android计算汇率代码,android studio 开发实例 连接网络获取汇率

    配置文件 AndroidManifest.xml 如下 Version:1.0StartHTML:000000243 EndHTML:000019067 StartFragment:000007811 ...

  2. Android Volley 库通过网络获取 JSON 数据

    本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...

  3. android 代码获取图片信息吗,Android 通过网络获取图片的代码

    Android 通过网络获取图片的代码 主activity package com.netimg; import android.app.Activity; import android.graphi ...

  4. android listview网络图片,Android ListView从网络获取图片及文字显示

    上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...

  5. Android ListView 和 ***Adapter 从本地/网络获取歌曲列表

    本文内容 环境 项目结构 测试数据 演示 1:SimpleAdapter 演示 2:BaseAdapter 演示 3:CustomLazyList 演示 4:CustomLazyCompleteLis ...

  6. Android ListView从网络获取图片及文字显示

    原帖地址:http://blog.csdn.net/wangjinyu501/article/details/8219317 上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从 ...

  7. android网络获取经纬,Android中透过GPS或NetWork获取当前位置的经纬度

    Android中通过GPS或NetWork获取当前位置的经纬度 private double latitude=0.0; private double longitude =0.0; Location ...

  8. Android 网络获取图片处理

    今天做项目,需要从网络获取图片,然后加载到Listview里面. 这边需要分为两步. 第一步:从网络获取图片 public InputStream getImageViewInputStream(St ...

  9. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

最新文章

  1. mysql批量导入 导出数据_MySQL批量导入导出数据
  2. 微助教课件怎么下载_初中英语八年级下册Unit3课堂要点归纳,知识点睛,语法练习(可下载打印,附答案)...
  3. docker的学习总结
  4. ML之NB:基于NB朴素贝叶斯算法训练20类新闻文本数据集进行多分类预测
  5. 2020-11-13(四大组件简单回忆内容)
  6. JVM调优:栈上分配和线程本地分配TLAB
  7. sftp 服务器外网访问设置
  8. 传统动态代理实现计算器类日志功能
  9. Word编写论文十大技巧
  10. 大数据量下 PageHelper 分页查询性能问题的解决办法
  11. CIC Dips Its Toe Back In US Waters
  12. 时文阅读-The economist-Whatever Carlos Ghosn’s misdeeds, Japan’s openness is also on trial
  13. 人从哪里来又到哪里去
  14. knife-4j 点击列表出现空白页怎么办?
  15. Kibana7.9.2设置elasticsearch索引过期时间,到期自动删除
  16. C++中的swap(交换函数)
  17. 《从零开始的RPG游戏制作教程》第二期:让勇者和怪物登场
  18. 小学生计算机特训营,杭州小学生军事特训营
  19. 李永乐(六)线性相关——笔记
  20. 鞍钢鲅鱼圈7m型焦炉建成投产

热门文章

  1. 从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链
  2. 数字网络监控和传统模拟监控的区别
  3. PLC实验:定时器/计数器功能实验
  4. 地铁客流量分析可视化演示系统(附代码)
  5. Samsung Electronics (三星电子)
  6. python错误警告 PEP8 W605 invalid escape sequence ‘\.‘
  7. 日本杂货连锁店Loft首家海外直营店于上海开业
  8. 对开源软件的认识与实践-刘彬
  9. kodexplorer可道云插件之控制台
  10. 从底特律的覆灭,反思“珠三角”未来