Android的HttpClient调用,冲突的解决办法

只适用部分情况

题外话

攻关百度自动发贴作推广失败,但登录已拿下。全扔有点浪费。

在登录的基础上写了个百度的自动签到系统,功能已实现(.net+nodejs)

用nodejs是我没摸清楚百度的RSA加密算法,索性就直接把百度的RSA加密移到nodejs了(都是JS)。

成功后又想了想,可以把.net实现迁移到JAVA,写个安卓百度签到的APP的应用,练练手复习安卓,顺带看能不能赚点广告费。

迁到JAVA的过程非常顺利,但是到Android就进了几个坑。

.NET 获取token代码 ,用微软给的HttpWebRequest和 Newtonsoft.Json DLL

 1  public string GetToken(CookieContainer cookies) {
 2             string token = "";
 3             DateTime dt = DateTime.Now;
 4             string tt = TimeUtils.ConvertDateTimeInt(dt).ToString() + "000";
 5             //这一步获取必定失败,更主要是为了获取百度的一些其他信息。
 6             token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
 7             //这一步会获取成功。
 8             token = NetHelper.HttpGet("https://passport.baidu.com/v2/api/?getapi&tpl=tb&apiver=v3&tt=" + tt + "&class=login&logintype=dialogLogin", ref cookies);
 9             JObject jo1 = (JObject)JsonConvert.DeserializeObject(token);
10             string tokenstring = jo1["data"]["token"].ToString();
11             return tokenstring;
12         }

封装的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源码改包名重打包编译的,折腾

三:有说扒个开源实现的(开源中国已扒),自已实现的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百度贴吧签到核心功能已实现。

时间: 2024-10-09 03:28:32

Android的HttpClient调用,冲突的解决办法的相关文章

配置Android环境遇到的问题及解决办法

配置Android环境遇到的问题及解决办法: 1 环境安装地址 http://pan.baidu.com/s/1jGzNzyI 2 其他: 2.1 安装 2.1.1 安装JDK,JRE 成功安装之后,进行测试是否真的成功安装,点击[开始]----[运行]----输入 CMD,在命令提示符里面输入"Java -version"并按回车键,出现版本号则安装成功. 2.1.2 安装Adb 2.1.3 打开Eclipse 2.2 配置环境变量: 2.2.1 配置JAVA环境变量 (见下方2.2

hash 冲突及解决办法。

hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元).查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败. 2) 再哈希法:同时构造多个不同的哈希函数. 3)链地址法:将所有哈希地址

arcgis安装msi安装包提示"在未标记为正在运行时,调用了RunScript”解决办法

安装msi安装包提示"在未标记为正在运行时,调用了RunScript”解决办法 windows/temp目录相关权限不对,右击temp文件夹,选择管理员获取所有权限.

多页面验证码冲突的解决办法

"多页面验证码冲突的解决办法" 多页面验证码冲突的解决办法,布布扣,bubuko.com

android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法

例如在用AlarmManager的时候 1 AlarmManager alarmMgr = (AlarmManager) mContext 2 .getSystemService(Context.ALARM_SERVICE); 3 Intent intent = new Intent(ALARM_ALERT); 4 // intent.setExtrasClassLoader(DBTask.class.getClassLoader()); 5 Bundle mBundle=new Bundle(

android sqlite3程序不存在的解决办法(转)

在android开发中,在使用命令行操作数据库sqlite时,有时候会遇到sqlite3 not found的问题.这是因为你的手机没有安装sqlite3程序.解决办法如下(两种办法结合起来解释的更清楚!!!): 方法1: sqlite3 not found的解决办法(转) 在Android开发方面,我是小白,起步没多久.最近用到了sqlite本地缓存数据,我希望像mysql一样通过命令行查看建立的表以及表中的数据,于是用adb shell进入,敲入sqlite3,提示 sqlite3: not

Eclipse下ADB报错:Android ADB server didn't ACK,解决办法

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9401981 ADB server didn't ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程

使用HttpModule实现网址重写和HttpHandler实现页面静态化冲突的解决办法

使用HttpModule实现网址重写和HttpHandler冲突的解决办法功能描述:1. 用HttpModule做了一个重写URL的功能,实现所有访问html的请求要经过httpModule处理,如果页面中有对应的aspx页面,就转发到那个页面,如果没有,就转发到原来请求的那个页面. 2. 但后面有做了一个使用HttpHandler是aspx页面静态化的功能,实现访问某一类的页面的时候,如果没有就使用模板创建html页面,如果有,就访问已存在的页面. 3. 做完上面两步,使用html的方式访问a

Android开发遇到的异常及解决办法

Android开发遇到的错误及解决方法1. Unable to resolve target 'android-7' 解决方案: 修改工程目录下的default.properties文件里的内容target=android-7改成target=android-12(或者其他版本)就可以了,最好用txt打开,然后修改之后保存,运行就可以了. 原代码如下: # This file is automatically generated by Android Tools.# Do not modify

兔子--Android Support v4包丢失的解决办法

在开发中,Android Support v4包丢失的解决办法: Project->properties->Java Build Path->Libraries->Add External Jars 中加入sdk目录下的extras/android/support/v4/android-support-v4.jar (如果找不到,则需要用sdk manager下载android support package)