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