当前位置: 首页 > 知识库问答 >
问题:

使用Retrofit下载cookie作为文件,然后再次将cookie作为文件转发

麹承
2023-03-14

以前,我使用bash脚本执行以下操作

curl --cookie-jar /tmp/cookie-file https://www.some-site.com

下载的 /tmp/cookie 文件将如下所示

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.some-site.com     TRUE    /       FALSE   1564858012      B       6tbvhitdm98os&b=3&s=q2
curl --cookie /tmp/cookie-file https://www.some-site.com/some-api

现在,我想执行相同的操作。但是使用Android。一直以来,我都在使用Retrofit库。

我是否可以知道,在改造中,我们如何将cookie下载到临时文件,然后再次提出另一个HTTP请求,以及以前下载的cookie文件?

共有2个答案

孙和安
2023-03-14

您可以使用CookieManager执行此操作。

添加此依赖项:

compile 'com.squareup.okhttp3:okhttp-urlconnection:3.6.0'

客户端生成器:

static OkHttpClient buildOkClientWithCookieManager() {
    CookieManager cookieHandler = new CookieManager();
    cookieHandler.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
    OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .cookieJar(new JavaNetCookieJar(cookieHandler));
    return builder.build();
}

在改装生成器中添加此客户端。

赫连棋
2023-03-14

改造由OKHttp支持,OKHttp接受请求的拦截器,因此您可以实现拦截来获取和添加cookie,如下所示:https://gist.github.com/tsuharesu/cbfd8f02d46498b01f1b

为了保持答案一致,我将复制上面的代码:

public class AddCookiesInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        HashSet<String> preferences = (HashSet) Preferences.getDefaultPreferences().getStringSet(Preferences.PREF_COOKIES, new HashSet<>());
        for (String cookie : preferences) {
            builder.addHeader("Cookie", cookie);
            Log.v("OkHttp", "Adding Header: " + cookie); // This is done so I know which headers are being added; this interceptor is used after the normal logging of OkHttp
        }

        return chain.proceed(builder.build());
    }
}

public class ReceivedCookiesInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());

        if (!originalResponse.headers("Set-Cookie").isEmpty()) {
            HashSet<String> cookies = new HashSet<>();

            for (String header : originalResponse.headers("Set-Cookie")) {
              cookies.add(header);
            }

            Preferences.getDefaultPreferences().edit()
                .putStringSet(Preferences.PREF_COOKIES, cookies)
                .apply();
        }

        return originalResponse;
    }
}

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
clientBuilder.addInterceptor(new AddCookiesInterceptor());
clientBuilder.addInterceptor(new ReceivedCookiesInterceptor());

new Retrofit.Builder()
            .client(clientBuilder.build())
            .build();

要点已经将cookie保存在共享首选项中,我认为这也是您的最佳选择。如果您需要将cookie保存在文件中,请发表评论,我会更新答案。

 类似资料:
  • 标题说明了一切: null 编辑:工作示例要简单得多(多亏了@T.S.): 谢谢!

  • 问题内容: 如何使用php将多个文件下载为zip文件? 问题答案: 您可以使用该类创建一个ZIP文件并将其流式传输到客户端。就像是: 并流式传输: 第二行强制浏览器向用户显示一个下载框,并提示名称filename.zip。第三行是可选的,但某些(主要是较旧的)浏览器在某些情况下会出现问题,而未指定内容大小。

  • 我正在使用AngularJS和Spring编写应用程序。我想向服务器发送请求,并下载控制器返回的响应作为文件。在控制器中,我有csv文件的内容(作为字符串),即<代码>1;2.3.4(1行4列)。将此响应下载为文件的最简单方法是什么? 下面,我发布了我的简化代码。Spring控制器: 在javascript中(AngularJS) 我还试图写入响应流(如下所示),设置标题,但在客户端,我总是以字符

  • 我正试图从以下链接下载所需的文件 后来,我也尝试使用cookie并运行代码,但没有成功。保存后的cookie文件没有数据。 我需要把上面的下载放在cronjob上,这样它就可以把文件保存到服务器上,然后我就可以完成剩下的处理了

  • 我正在尝试使用WebClient从外部服务下载文件并将其返回到客户端。在Rest控制器中,我有以下endpoint: 当我尝试击中endpoint时,我得到以下错误: 我已尝试返回

  • 我需要将GIF放到输入连接https://developer.android.com/guide/topics/text/image-keyboard.html 但是我有一个问题,因为我需要获取这个GIF的uri。我不能像文件一样加载它,并且只能得到它的路径。我怎么才能拿到URI呢?或者我需要用另一种方式来做这件事?