如何防止Retrofit自动跟随302

nak*_*ive 17 cookies android retrofit okhttp

我有一个身份验证调用,我正在尝试使用Android上的Retrofit.该调用将302返回到成功或失败页面.最初的302响应会返回维护身份验证成功所需的会话cookie,但是在我有机会使用cookie之前,Retrofit会自动将请求关闭到重定向URL.

有没有办法阻止重定向?或者有没有办法在Retrofit上编写响应处理程序,可以在进行第二次调用之前添加适当的标头?

Cli*_*ize 14

要防止重定向,你必须配置你的客户端,例如使用OkHttp 2:

private sendRequest() {
    OkHttpClient client = new OkHttpClient();
    client.setFollowRedirects(false);

    connectAdapter = new RestAdapter.Builder()
            .setClient(new OkClient(client))
            .setEndpoint("http://yourendpoint")
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();

    connectAdapter.create(YourRequest.class).sendMyRequest("login","password");

}
Run Code Online (Sandbox Code Playgroud)

使用OKHTTP 3(您可以从@gropapa 阅读此答案):

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.followRedirects(false);
OkHttpClient httpClient = builder.build();
Run Code Online (Sandbox Code Playgroud)


gro*_*apa 6

如果帖子很旧的话,这是我对OkHttp 3的回答,只需使用以下构建器

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.followRedirects(false);
OkHttpClient httpClient = builder.build();
Run Code Online (Sandbox Code Playgroud)

在Response对象(我实际上使用Retrofit)中,您将在

response.headers.get("Location")
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


VM4*_*VM4 0

我的情况和你类似。基本上我们需要的只是捕获服务器在重定向之前返回的“Set-Cookie”标头。这是我使用 OkHTTP 处理它的方式:

final OkHttpClient client = new OkHttpClient();
CookieHandler handler = client.getCookieHandler();
CookieManager manager = new CookieManager();
handler.setDefault(manager);

//boilerplate:
RequestBody formData = new FormEncodingBuilder()
        .add("req_username", username)
        .add("req_password", password).build();
Request request = new Request.Builder().url(LOGIN_URL).post(formData).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

// print our cookies:
List <HttpCookie> cookies = manager.getCookieStore().getCookies();
for(HttpCookie cookie : cookies) {
    Log.v(TAG, cookie.getName() + "=" + cookie.getValue());
}
Run Code Online (Sandbox Code Playgroud)