首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android上使用cookie发出http请求?

如何在Android上使用cookie发出http请求?
EN

Stack Overflow用户
提问于 2009-03-24 18:31:56
回答 3查看 123.9K关注 0票数 124

我想在正确处理cookie的同时向远程服务器发出http请求(例如,存储服务器发送的cookies,并在我发出后续请求时发送这些cookies )。保留任何和所有的cookie是很好的,但实际上我唯一关心的是会话cookie。

对于java.net,实现这一点的首选方法似乎是使用java.net.CookieHandler (抽象基类)和java.net.CookieManager (具体实现)。安卓有java.net.CookieHandler,但它似乎没有java.net.CookieManager。

我可以通过检查http头文件来手动编写代码,但似乎必须有一种更简单的方法。

在Android上发出http请求同时保留cookie的正确方式是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-26 20:28:16

事实证明,谷歌安卓是与ApacheLogon4.0一起发布的,我能够通过使用HttpClient docs中的“基于表单的登录”示例来了解如何做到这一点

https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * A example that demonstrates how HttpClient APIs can be used to perform
 * form-based logon.
 */
public class ClientFormLogin {

    public static void main(String[] args) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpGet httpget = new HttpGet("https://portal.sun.com/portal/dt");

        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
        System.out.println("Initial set of cookies:");
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        HttpPost httpost = new HttpPost("https://portal.sun.com/amserver/UI/Login?" +
                "org=self_registered_users&" +
                "goto=/portal/dt&" +
                "gotoOnFail=/portal/dt?error=true");

        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("IDToken1", "username"));
        nvps.add(new BasicNameValuePair("IDToken2", "password"));

        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

        response = httpclient.execute(httpost);
        entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }

        System.out.println("Post logon cookies:");
        cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        // When HttpClient instance is no longer needed, 
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();        
    }
}
票数 92
EN

Stack Overflow用户

发布于 2014-04-12 00:45:23

cookie只是另一个HTTP标头。您总是可以在使用Apache库或HTTPUrlConnection进行HTTP调用时设置它。无论采用哪种方式,您都应该能够以这种方式读取和设置HTTP cookie。

你可以阅读this article了解更多信息。

我可以分享我的安宁代码来演示你是多么容易做到这一点。

代码语言:javascript
复制
public static String getServerResponseByHttpGet(String url, String token) {

        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);
            get.setHeader("Cookie", "PHPSESSID=" + token + ";");
            Log.d(TAG, "Try to open => " + url);

            HttpResponse httpResponse = client.execute(get);
            int connectionStatusCode = httpResponse.getStatusLine().getStatusCode();
            Log.d(TAG, "Connection code: " + connectionStatusCode + " for request: " + url);

            HttpEntity entity = httpResponse.getEntity();
            String serverResponse = EntityUtils.toString(entity);
            Log.d(TAG, "Server response for request " + url + " => " + serverResponse);

            if(!isStatusOk(connectionStatusCode))
                return null;

            return serverResponse;

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
票数 9
EN

Stack Overflow用户

发布于 2009-03-24 20:01:20

我不使用谷歌android,但我想你会发现让它工作并不那么难。如果您阅读the relevant bit of the java tutorial,您将看到注册的cookiehandler从HTTP码获得回调。

所以如果没有默认值(你有没有检查过CookieHandler.getDefault()是否真的是空的?)然后,您可以简单地扩展CookieHandler,实现put/get,并使其几乎自动工作。如果你走这条路,一定要考虑并发访问等问题。

编辑:显然,您必须通过CookieHandler.setDefault()将自定义实现的一个实例设置为默认处理程序,以接收回调。忘了提这件事了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/678630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档