Android的HttpClient调用,冲突的解决办法
只适用部分情况
题外话
攻关百度自动发贴作推广失败,但登录已拿下。全扔有点浪费。
在登录的基础上写了个百度的自动签到系统,功能已实现([java,android,nodejs,.net]+nodejs)
用nodejs是我没摸清楚百度的RSA加密算法,试了很多都失败,索性就直接把百度的RSA加密过程提取出来,移到nodejs了(都是JS)。
成功后又想了想,可以把.net实现迁移到JAVA,写个安卓百度签到的APP的应用,练练手复习安卓。
迁到JAVA的过程非常顺利,但是到Android就进了几个坑。
.NET 获取token代码 ,用微软给的HttpWebRequest和 Newtonsoft.Json DLL
public string GetToken(CookieContainer cookies) {
string token = "";
DateTime dt = DateTime.Now;
string tt = TimeUtils.ConvertDateTimeInt(dt).ToString() + "";
//这一步获取必定失败,更主要是为了获取百度的一些其他信息。
token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
//这一步会获取成功。
token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
JObject jo1 = (JObject)JsonConvert.DeserializeObject(token);
string tokenstring = jo1["data"]["token"].ToString();
return tokenstring;
}
封装的Http API
public static string HttpGet(string Url, ref CookieContainer cookie)
{
string strResult =string.Empty;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
//request.Referer = "http://www.wangpiao.com/movie/25149/?showulcinfo=1";
request.Headers.Set("Pragma", "no-cache");
request.CookieContainer = cookie;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream streamReceive = response.GetResponseStream();
Encoding encoding = Encoding.GetEncoding("UTF-8");
StreamReader streamReader = new StreamReader(streamReceive, encoding);
strResult = streamReader.ReadToEnd();
cookie.Add(response.Cookies);
}
catch (Exception ex)
{
//MessageBox.Show(ex.ToString()+"出错");
}
return strResult;
}
迁到JAVA引用Apache httpclient4.3.5,和GSON JSON解析包。
private static String GetTimeString(){
Date now = new Date();
return now.getTime()+"";
}
public void GetToken()throws Exception {
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookies)
.build();
String tt=GetTimeString();
try {
HttpGet httpget = new HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin");
CloseableHttpResponse response1 = httpclient.execute(httpget);
try {
response1 = httpclient.execute(httpget);
ByteArrayInputStream bis = new ByteArrayInputStream(EntityUtils.toByteArray(response1.getEntity()));
String ss=convertStreamToString(bis).replace("/n", "");
JsonParser jsonparer = new JsonParser();//初始化解析json格式的对象
token = jsonparer.parse(ss).getAsJsonObject().get("data").getAsJsonObject().get("token").getAsString();
} finally {
response1.close();
}
}finally {
httpclient.close();
}
}
public static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
OK,JAVA+NODEJS也已实现。
就差一步了,JAVA到android不是很容易嘛,结果这一步坑了我两个小时
首先 编译不过
之后 运行出错
根本原因都是因为android自带了个httpclient的包。和引用的httpclient4.3.5冲突。
询问得知几种方法
一:有就让用anroid的(这不是费话么,用android的能解决我干嘛要引,android(版本 19)的自带的包不支持cookie,开发要用的)
二:有说拿httpclient4.3.5源码改包名重打包编译的,折腾
三:有说扒个开源实现的(开源中国已扒),自已实现的一个精简的request包,自实现cookie,代码差距太太,几乎要重写,也折腾。
四:这是自已无意翻来的,搜了一个回答说4.3.3不冲突,顺道看了看http://hc.apache.org/downloads.cgi,冲突不冲突,我还不知道,不过眼前一亮,发现了这个
HttpClient for Android 4.3.5 (GA)
这就是主角了,满心欢喜的引了,几翻处理完,OK,编译过了,执行,还是报错
不过这包是直接给的源码,追下去,找到办法了,异常堆栈的大概印象。
Args.NotNull:item may not be null
RegisterBuilder.register Arg.notNull
HttpClientBuilder register("https",sslSocketFactory)
sslSocketFactory 这玩意为null了。
builder里有sslSocketFactory 的新建实例操作,追下去,发现不进。
原因是systemProperties默认的值为false。
搜systemProperties 发现一个方法会设置该值,调用,这下总算是OK了。
对比下
JAVA调用
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookies)
.build();
Android修改为
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties()
.setDefaultCookieStore(cookies)
.build();
这下一切OK了
对了,Android还要记得设INTERNET权限
android app百度贴吧签到核心功能已实现。
Android的HttpClient调用,冲突的解决办法的更多相关文章
- android中控件公用产生的冲突的解决办法
1.ViewPager嵌套HorizontalScrollView滑动冲突的解决办法,重写ViewPager public class ZdyViewPage extends ViewPager { ...
- 配置Android环境遇到的问题及解决办法
配置Android环境遇到的问题及解决办法: 1 环境安装地址 http://pan.baidu.com/s/1jGzNzyI 2 其他: 2.1 安装 2.1.1 安装JDK,JRE 成功安装之后, ...
- arcgis安装msi安装包提示"在未标记为正在运行时,调用了RunScript”解决办法
安装msi安装包提示"在未标记为正在运行时,调用了RunScript”解决办法 windows/temp目录相关权限不对,右击temp文件夹,选择管理员获取所有权限.
- jQuery的AJAX方法简介及与其他文件$符号冲突的解决办法
一.重要的jQuery AJAX方法简介 $.load(url) 从服务器载入数据 $.get(url,callback) 从服务器请求数据,并执行回调函数 $.post(url,data,callb ...
- 使用HttpModule实现网址重写和HttpHandler实现页面静态化冲突的解决办法
使用HttpModule实现网址重写和HttpHandler冲突的解决办法功能描述:1. 用HttpModule做了一个重写URL的功能,实现所有访问html的请求要经过httpModule处理,如果 ...
- hash 冲突及解决办法。
hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿 ...
- vscode 快捷键 ctrl+shift+F 冲突了 解决办法
vscode 快捷键 ctrl+shift+F 冲突了 解决办法 1.修复 搜狗输入法 ctrl+shift+F 中文 繁体简体的快捷键冲突 2.修复 微软输入法 ctrl+shift+F 冲突 ( ...
- import android.support.v4或者import android.support.v7提示导入错误解决办法
转自: http://blog.csdn.net/forandever/article/details/37655139 在使用Eclipse开发andriod程序时,程序中提示import and ...
- Android无法导入下载好的项目(和Eclipse中已经存在的项目命名一样导致冲突)解决办法
错误提示: 在我们到导入从网络下载的项目时,经常会出现如下问题(选择的项目变灰,并且提示要选择至少一个项目): 错误原因: 出现这样的错误主要是因为你的Eclipse已经存在了和上图中New Proj ...
- android 常见内存泄漏原因及解决办法
android常见内存泄漏主要有以下几类: 一.Handler 引起的内存泄漏. 在Android开发中,我们经常会使用Handler来控制主线程UI程序的界面变化,使用非常简单方便,但是稍不注意,很 ...
随机推荐
- CodeForces 1294D MEX maximizing(思维)
http://codeforces.com/contest/1294/problem/D 大致题意: 刚开始有一个空集合,会往里添加q次数,每次加一个值,而且你可以让这个数任意加减x若干次 每次添加后 ...
- node.js实现http服务器进行访问
步骤:一.安装node;二.新建一个文件夹目录(根目录),里面再新建一个server.js文件:三.打开命令行界面,进入文件夹目录然后输入命令node server.js;四.然后就可以在浏览器上通过 ...
- linux配置词典goldendict
在mint 18下使用通过, ubuntu 类似. 方法: 通过软件中心安装goldendict,或者 sudo apt install goldendict 通过网页抓取程序, 见附录 下载朗道词典 ...
- 如何在 main() 执行之前先运行其它函数
摘要:我们知道 C++ 的全局对象的构造函数会在 main 函数之前先运行,其实在 c 语言里面很早就有啦,在 gcc 中可以使用 __attribute__ 关键字指定如下(在编译器编译的时候就绝决 ...
- Linux学习(二) --- 常用命令
[TOC] 一.常用命令 1.目录 cd切换 cd 路径 切换到指定路径 cd .. 上一级 mkdir:创建目录 mkdir 目录名 pwd:查看 2.查看 ll命令:查询目录内容 ll 查看当前( ...
- 学习spring第四天
Spring第四天讲义 今日内容 Spring的事务管理 Spring和MyBatis框架的集成 1. Spring的事务管理 1.1. 事务是什么? 在操作数据库时(增删改),如果同时操作多次数据, ...
- 从 0 到 1 到完美,写一个 js 库、node 库、前端组件库
之前讲了很多关于项目工程化.前端架构.前端构建等方面的技术,这次说说怎么写一个完美的第三方库. 1. 选择合适的规范来写代码 js 模块化的发展大致有这样一个过程 iife => commonj ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题
用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...
- python_8_集合
1.集合:可变集合set,不可变集合frozenset,集合是无序不重复的 set('hello') set9[1,2,3,4]) set((1,2,3)) 2.添加元素 > add:将元素整体 ...
- 回归分析|r^2|Se|变差|多重相关系数|决定系数|多重共线性|容忍度|VIF|forward selection|backward elimination|stepwise regression procedure|best-subset approach|回归方程的置信区间|预测区间|残差分析|虚拟变量
应用统计学-回归分析 拟合度使用r^2和Se来检验. 显著性检验中,对于线性model使用ANOVA,对于单独的回归系数使用t检验. 最小二乘法.贝叶斯和最大似然都可用于求回归参数,最小二乘法是最小化 ...