首页 > 解决方案 > 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

标签: androidretrofit2okhttp3

解决方案


因此,事实证明服务器在我不知情的情况下重定向了请求。我在尝试 HTTP 客户端选项时偶然发现了这一点。

对于这个(非常、非常)特定场景,解决方案是禁用以下重定向。

因此,我更改了改造构建器方法以执行以下操作:

OkHttpClient clt = new OkHttpClient().Builder()
builder.followRedirects(false)   // <-- Important!
...
.build();

Retrofit r = new Retrofit.Builder()
.client(clt)
...
.build();

仍然不知道为什么它在较新版本的android中有效。

希望这对任何人都有帮助。

干杯

-nls


推荐阅读