android - Retrofit2 发布表单数据适用于 android 7,而不是 android 5
问题描述
我正在使用 retrofit2 在 multipart/form-data 中发布凭据。目标是接收会话 cookie。
该解决方案在 Android 8 中按预期运行,但似乎无法在 5 - 6 等旧版本上运行。我没有收到任何错误,但服务器没有返回任何 cookie。
代码看起来像这样
protected Void doInBackground(Void... params) {
if (service == null) {
boxRestService = getService(Constants.URL);
}
MultipartBody mPart = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(Constants.FORMS_USERNAME, credentials.first)
.addFormDataPart(Constants.FORMS_PASSWORD, credentials.second).build();
Call<ResponseBody> currentCall = service.getFormAuthCookie(mPart);
try {
currentCall.execute();
} catch (Exception e) {
Log.d("GET_AUTH_BACKGROUND", e.getMessage());
}
return null;
}
此外,调用看起来像这样:
@POST("/check/login")
Call<ResponseBody> getFormAuthCookie(@Body MultipartBody body);
在这两个平台中,改造都会产生相同的(正确的)发布请求:
--> POST https://website.dom/check/login http/1.1
Content-Type: multipart/form-data; boundary=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
Content-Length: 258
--aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
Content-Disposition: form-data; name="sph_username"
Username
--aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
Content-Disposition: form-data; name="sph_password"
Password
--aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa--
--> END POST (258-byte body)
由于下一个请求需要 cookie,因此该请求在后台线程中同步执行。
对于 cookie 部分,我认为这不是问题,我使用的是 JavaNetCookieJar。
该请求也可以使用 Advanced Rest Client 正常工作。
我确定我遗漏了一些非常明显的东西。
这些方法可用于较旧的 android 版本吗?
非常感谢你。
-nls
解决方案
因此,事实证明服务器在我不知情的情况下重定向了请求。我在尝试 HTTP 客户端选项时偶然发现了这一点。
对于这个(非常、非常)特定场景,解决方案是禁用以下重定向。
因此,我更改了改造构建器方法以执行以下操作:
OkHttpClient clt = new OkHttpClient().Builder()
builder.followRedirects(false) // <-- Important!
...
.build();
Retrofit r = new Retrofit.Builder()
.client(clt)
...
.build();
仍然不知道为什么它在较新版本的android中有效。
希望这对任何人都有帮助。
干杯
-nls
推荐阅读
- ios - 从 Objective-C 类调用 Swift 方法的语法
- file - 如何使用 Blazor 上传本地 json 文件
- php - php从数组json输出中获取值
- java - Jackson JsonMappingException 继续并获得完整的报告
- django - 除了视图,是否有等效的 django-hitcount 模板标签?
- python - 电子邮件的python IMAP内容包含一个字符串
- unix - 如何在 unix 的列中找出大于 10 的间隙?
- java - javax.net.ssl.SSLHandshakeException:在 Raspberry Pi 上运行 java 程序时出错
- amazon-web-services - 同步 RDS DB 和 Cognito 的最佳方式
- docker - 如何强制 Kubernetes 加载 mysql db?