Retrofit2 发布表单数据有效 android 7,而不是 android 5

Retrofit2 posting form-data works android 7, not android 5

我在 multipart/form-data 中使用 retrofit2 来 post 凭据。目标是接收会话 cookie。

该解决方案在 Android 8 中按预期工作 运行,但似乎无法在旧版本(如 5 - 6)上工作。我没有收到任何错误,但服务器没有return 任何 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 请求:

--> 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