以前,我使用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文件?
您可以使用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();
}
在改装生成器中添加此客户端。
改造由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呢?或者我需要用另一种方式来做这件事?