GVKun编程网logo

Android HttpClient和Cookies

13

在这里,我们将给大家分享关于AndroidHttpClient和Cookies的知识,同时也会涉及到如何更有效地AndroidHttpClient、androidhttpClient(https/ht

在这里,我们将给大家分享关于Android HttpClient和Cookies的知识,同时也会涉及到如何更有效地Android HttpClient、android httpClient (https/http) 的优化构建方式二、Android HttpClient Cookie、Android HttpClient Cookie 保持登录的内容。

本文目录一览:

Android HttpClient和Cookies

Android HttpClient和Cookies

我在Android中的HttpClient遇到问题:通过使用以下代码,我想使用通过Web视图登录之前已设置的cookie。因此,登录数据应该存在并且确实存在,我对此进行了测试。但是,当我在httppost或httpget中使用cookie时,它不使用登录数据。但是这些cookie实际上应该足以接收需要登录的页面,不是吗?我不确定我是否需要以特殊方式将cookie发送到服务器,或者是否足以将cookie加载到httpcontext中。这是代码:

DefaultHttpClient httpclient = new DefaultHttpClient();CookieStore lCS = new BasicCookieStore();if (CookieManager.getInstance().getCookie(pUrl) != null) {      String cookieString = CookieManager.getInstance().getCookie(pUrl);    String[] urlCookieArray = cookieString.split(";");    for (int i = 0; i < urlCookieArray.length; i++) {                   System.out.println(urlCookieArray[i]);                  String[] singleCookie = urlCookieArray[i].split("=");        Cookie urlCookie = new BasicClientCookie(singleCookie[0], singleCookie[1]);        lCS.addCookie(urlCookie);               }}HttpContext localContext = new BasicHttpContext();httpclient.setCookieStore(lCS);localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);HttpPost httppost = new HttpPost(pUrl);    // get the url connection       try {    StringBuilder sb = new StringBuilder();         HttpResponse response = httpclient.execute(httppost, localContext);         InputStream is = response.getEntity().getContent();             InputStreamReader isr = new InputStreamReader(is);

而且,如果我运行代码,我只会收到该站点的登录页面,因此它不接受Cookie。

预先感谢您的帮助

蒂莫问候

答案1

小编典典

我遇到了同样的问题,并且使用了与问题类似的方法,但是没有运气。对我来说起作用的是为每个复制的cookie添加域。(BasicClientCookie
cookie.setDomain(String))

我的效用函数:

public static BasicCookieStore getCookieStore(String cookies, String domain) {    String[] cookieValues = cookies.split(";");    BasicCookieStore cs = new BasicCookieStore();    BasicClientCookie cookie;    for (int i = 0; i < cookieValues.length; i++) {        String[] split = cookieValues[i].split("=");        if (split.length == 2)            cookie = new BasicClientCookie(split[0], split[1]);        else            cookie = new BasicClientCookie(split[0], null);        cookie.setDomain(domain);        cs.addCookie(cookie);    }    return cs;} String cookies = CookieManager.getInstance().getCookie(url); BasicCookieStore lCS = getCookieStore(cookies, MyApp.sDomain); HttpContext localContext = new BasicHttpContext(); DefaultHttpClient httpclient = new DefaultHttpClient(); httpclient.setCookieStore(lCS); localContext.setAttribute(ClientContext.COOKIE_STORE, lCS); ...

Android HttpClient

Android HttpClient

 


package alex.reader.ebook.bam;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class SimpleClient extends Activity {
    private HttpParams httpParams;
    private HttpClient httpClient;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_client);
        EditText editText = (EditText) this.findViewById(R.id.EditText01);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("email", "firewings.r@gmail.com"));
        params.add(new BasicNameValuePair("password", "954619"));
        params.add(new BasicNameValuePair("remember", "1"));
        params.add(new BasicNameValuePair("from", "kx"));
        params.add(new BasicNameValuePair("login", "登 录"));
        params.add(new BasicNameValuePair("refcode", ""));
        params.add(new BasicNameValuePair("refuid", "0"));
        Map params2 = new HashMap();
        params2.put("hl", "zh-CN");
        params2.put("source", "hp");
        params2.put("q", "haha");
        params2.put("aq", "f");
        params2.put("aqi", "g10");
        params2.put("aql", "");
        params2.put("oq", "");
        String url2 = "http://www.google.cn/search";
        String url = "http://wap.kaixin001.com/home/";
        getHttpClient();
        editText.setText(doPost(url, params));
        // editText.setText(doGet(url2, params2));
    }
    public String doGet(String url, Map params) {
        /* 建立HTTPGet对象 */
        String paramStr = "";
        Iterator iter = params.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            paramStr += paramStr = "&" + key + "=" + val;
        }
        if (!paramStr.equals("")) {
            paramStr = paramStr.replaceFirst("&", "?");
            url += paramStr;
        }
        HttpGet httpRequest = new HttpGet(url);
        String strResult = "doGetError";
        try {
            /* 发送请求并等待响应 */
            HttpResponse httpResponse = httpClient.execute(httpRequest);
            /* 若状态码为200 ok */
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                /* 读返回数据 */
                strResult = EntityUtils.toString(httpResponse.getEntity());
            } else {
                strResult = "Error Response: "
                        + httpResponse.getStatusLine().toString();
            }
        } catch (ClientProtocolException e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (IOException e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (Exception e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        }
        Log.v("strResult", strResult);
        return strResult;
    }
    public String doPost(String url, List<NameValuePair> params) {
        /* 建立HTTPPost对象 */
        HttpPost httpRequest = new HttpPost(url);
        String strResult = "doPostError";
        try {
            /* 添加请求参数到请求对象 */
            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            /* 发送请求并等待响应 */
            HttpResponse httpResponse = httpClient.execute(httpRequest);
            /* 若状态码为200 ok */
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                /* 读返回数据 */
                strResult = EntityUtils.toString(httpResponse.getEntity());
            } else {
                strResult = "Error Response: "
                        + httpResponse.getStatusLine().toString();
            }
        } catch (ClientProtocolException e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (IOException e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (Exception e) {
            strResult = e.getMessage().toString();
            e.printStackTrace();
        }
        Log.v("strResult", strResult);
        return strResult;
    }
    public HttpClient getHttpClient() {
        // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)
        this.httpParams = new BasicHttpParams();
        // 设置连接超时和 Socket 超时,以及 Socket 缓存大小
        HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);
        HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);
        HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
        // 设置重定向,缺省为 true
        HttpClientParams.setRedirecting(httpParams, true);
        // 设置 user agent
        String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
        HttpProtocolParams.setUserAgent(httpParams, userAgent);
        // 创建一个 HttpClient 实例
        // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
        // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient
        httpClient = new DefaultHttpClient(httpParams);
        return httpClient;
    }
}

 

 

android httpClient (https/http) 的优化构建方式二

android httpClient (https/http) 的优化构建方式二

由于时间原因,这里只构建所有请求 https 都能通过的请求 client

首先定义(重写)信任管理器

    public class SSLTrustManager implements javax.net.ssl.TrustManager,
            javax.net.ssl.X509TrustManager ,HostnameVerifier{
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
 
        public boolean isServerTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }
 
        public boolean isClientTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }
 
        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }
 
        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }
        
        	@Override
		public boolean verify(String urlHostName, SSLSession session) //允许所有主机
			return true;
		}
    }

然后封装

 public static HttpURLConnection connect(String strUrl) throws Exception {
        
    	 javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
         javax.net.ssl.TrustManager tm = new SSLTrustManager();
         trustAllCerts[0] = tm;
         javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext
                 .getInstance("SSL");
         sc.init(null, trustAllCerts, null);
         javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc
                 .getSocketFactory());
         
         HttpsURLConnection.setDefaultHostnameVerifier((HostnameVerifier) tm);
         
        URL url = new URL(strUrl);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
     
        return urlConn;
    }

测试一下

public void unitest()
{
     HttpURLConnection urlConn = connect(''https://github.com/'');
        urlConn.setDoInput(true);
        urlConn.setRequestMethod("GET");
        urlConn.connect();
        InputStream is = urlConn.getInputStream();
        StringBuffer sb = new StringBuffer();
        if(is!=null)
        {
        	BufferedReader br = new BufferedReader(new InputStreamReader(is));
        	String s = null;
        	while ((s=br.readLine())!=null)
        	{
				sb.append(s).append("\n");
			}
        }
        System.out.println("Content:\n"+sb.toString());
}

try do it!

Android HttpClient Cookie

Android HttpClient是否具有Cookie的自动管理功能?

解决方法

它支持它.

阅读下面的帖子似乎是在调用执行时必须传递相同的HttpContext.

response = httpClient.execute(httpPost,localContext);

究竟该怎么办就是在这篇文章:Android project using httpclient –> http.client (apache),post/get method

How do I manage cookies with HttpClient in Android and/or Java?

Android HttpClient Cookie 保持登录



保存cookie

List<Cookie> cookies = httpClient.getCookieStore().getCookies();

if (cookies != null) {

for (Cookie cookie : cookies) {

String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();                        

       CookieManager.getInstance().setCookie(cookie.getDomain(), cookieString);  

}

}

CookieSyncManager.getInstance().sync();


使用cookie

                String[] keyValueSets = CookieManager.getInstance().getCookie(domain).split(";");

for(String cookie : keyValueSets) {

   String[] keyValue = cookie.split("=");

   String key = keyValue[0];

   String value = "";

   if(keyValue.length>1) value = keyValue[1];

   BasicClientCookie baseCookie = new BasicClientCookie(key, value);

   baseCookie.setDomain(domain);

   httpClient.getCookieStore().addCookie(baseCookie);

}



我们今天的关于Android HttpClient和Cookies的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android HttpClient、android httpClient (https/http) 的优化构建方式二、Android HttpClient Cookie、Android HttpClient Cookie 保持登录的相关信息,请在本站查询。

本文标签: