HttpClient 模拟登录搜狐微博

http://mengyang.iteye.com/blog/575671
第一次遇到一个这样的问题,"PKIX path building failed" 异常
 
 
大概意思是,证书出问题了,服务器不信任我们自己创建的证书。
两种解决方法
     1.请求时添加代码忽略证书信任问题
          我用httpClient,简单明了的两句代码(支持SSL,也就是以https://开头的,一般是http://)
                  Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory(), 443);
                  Protocol.registerProtocol("https", myhttps);
     2.代码控制证书生成,导入,再请求
 
 
成功例子:
      private static void testLogin()
      {
            try
            {
                  String callback_url = "http://www.wedfvd.com";
                  
                  TSohu tsohu = new TSohu(AConstants.TSOHU_APP_KEY,AConstants.TSOHU_APP_KEY_SECRET);
                  
                  TSohuOAuthClient oc = new TSohuOAuthClient();//OAuth认证授权以及签名相关
                  TSohuOAuth requestOAuth = oc.requestToken(tsohu);
                  //hd=default&
//                String authorizeUrl = "http://api.t.sohu.com/oauth/authorize?oauth_token="
//                            + requestOAuth.getOauth_token() + "&oauth_callback=" + callback_url;
                  
                  HttpClient httpClient = new HttpClient();
                  
                  String loginUrl = "https://passport.sohu.com/sso/login.jsp?appid=1073&persistentcookie=1&s="+new Date().getTime()+"&b=6&w=1024&pwdtype=1&v=26";
                  loginUrl += "&userid="+URLEncoder.encode("zzzzzzzzzzzz@sohu.com", "utf-8")+"&password="+MD5Util.encrypt("123456");
                  
                  Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory(), 443);
                  Protocol.registerProtocol("https", myhttps);
                  
                  GetMethod get = new GetMethod(loginUrl);
                  int status = httpClient.executeMethod(get);
//                System.out.println(status+" "+get.getResponseBodyAsString());
                  
                  PostMethod post = new PostMethod("http://api.t.sohu.com/oauth/authorize");
                  post.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
                  post.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
                  post.getParams().setParameter("http.protocol.single-cookie-header", true);
                  
                  NameValuePair[] params = new NameValuePair[]{
                              new NameValuePair("oauth_token", requestOAuth.getOauth_token()),
                              new NameValuePair("oauth_callback", callback_url)
                  };
                  post.setRequestBody(params);
                  
                  int statusCode = httpClient.executeMethod(post);
//                String response = post.getResponseBodyAsString();
//                System.out.println(statusCode+" "+response);
                  
                  if (post.getResponseHeader("Location") != null) {
                        String location = post.getResponseHeader("Location").getValue();
                        String oauthVerifier = StringUtils.substringAfter(location, "oauth_verifier=");
//                      System.out.println(oauthVerifier);
                        
                        requestOAuth.setOauth_verifier(oauthVerifier);
                        TSohuOAuth accessOAuth = oc.accessToken(requestOAuth);
                        
                        TSohuAccessToken accessToken = new                TSohuAccessToken(accessOAuth.getOauth_token(),accessOAuth.getOauth_token_secret());
                        tsohu.setToken(accessToken);
                        
                        User user = tsohu.verify_credentials();
                        
                        accessToken.setUserid(Long.valueOf(user.getId()));
                        accessToken.setScreen_name(user.getScreenName());
                        
                        System.out.println("搜狐微博用户"+user.getScreenName()+"授权码:");
                        System.out.println("token:"+accessToken.getToken());
                        System.out.println("tokenSecret:"+accessToken.getTokenSecret());
                  } else {
                        if (statusCode != 200) {
                              throw new RuntimeException("访问网络资源出现问题,错误码为: " + statusCode);
                        }
                  }
            } catch (Exception e)
            {
                  e.printStackTrace();
            }
      }
posted @ 2014-11-08 11:37  程序员斯文  阅读(545)  评论(0编辑  收藏  举报