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

用java.net中,似乎首选的方法是使用java.网CookieHandler(抽象基类)和java.网CookieManager(具体实施).Android有java.网CookieHandler,但它似乎没有java.网库克经理.

我可以通过判断http头手工编写所有代码,但似乎一定有更简单的方法.

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

推荐答案

事实证明,Google Android附带了Apache HttpClient 4.0,我能够通过HttpClient docs中的"基于表单的登录"示例来了解如何做到这一点:

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


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();        
    }
}

Android相关问答推荐

为什么使用. DeliverveAsState()时会出现空指针异常?

如何使用视图模型触发可变状态?

有没有办法知道每台安卓设备上的通知限制?

如何消除脚手架和顶杆(material 3)更改 colored颜色 时的延迟?

DocumentFile.canWrite()、DocumentFile.Existes()-使用本地内置手机存储(而不是云)时性能较差(占用太多CPU时间)

如何在Jetpack Compose中更新异步回调的用户界面

Android-LVL库始终返回NOT_SUBLISTED

我怎样才能画一条线在喷气背包组成和有一个自定义的角落?

为什么我在 android 中使用 TabLayout 时无法启动我的 Activity?

如何在卡片视图右侧添加箭头

Android Studio Relay插件(版本0.3.07)错误

Jetpack Compose 中带有权重的行和 AnimatedVisibility 会 destruct UI

状态更改后 colored颜色 未正确更改

如何正确地将图像上传到 Jetpack Compose 中的 LazyList 中的项目?

在 Kotlin 中打开新片段时如何对当前片段应用更改?

如何在 Dolphin 中启用 android studio new logcat | 2021.3.1 金丝雀 6?

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

在 android list 中添加 IsMonitoringTool 元数据标志的位置

Jetpack 使用 Canvas 组成半圆

单个用户可以在 Firebase 身份验证中将多个电话号码链接到他的帐户吗?