我有一个身份验证通话,我试图在Android上使用Retrofit。该调用将302返回到成功或失败页面。最初的302响应会返回维护身份验证成功所需的会话cookie,但是在我有机会使用cookie之前,Retrofit会自动将请求移交给重定向URL。
有没有办法阻止重定向?或者有没有办法在Retrofit上编写响应处理程序,可以在进行第二次调用之前添加适当的标头?
答案 0 :(得分:10)
以防止您必须配置客户端的重定向,例如使用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");
}
使用OKHTTP 3(您可以从@gropapa阅读此answer):
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.followRedirects(false);
OkHttpClient httpClient = builder.build();
答案 1 :(得分:3)
如果帖子非常陈旧,请参阅OkHttp 3,这是我的答案 只需使用构建器作为以下
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.followRedirects(false);
OkHttpClient httpClient = builder.build();
在Response对象中(我实际使用Retrofit),您将在
中找到重定向网址response.headers.get("Location")
希望这有帮助
答案 2 :(得分:2)
我知道这是一个老帖子,也许它对某人来说仍然有用。 我有类似的问题,我的解决方案是将一个redirectStrategy(http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html)添加到httpClient:
private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder()
.setEndpoint(HTTP_TEST_URL)
.setClient(new ApacheClient(HttpClients.custom()
.setRedirectStrategy(new RedirectStrategy() {
@Override
public boolean isRedirected(HttpRequest request, HttpResponse response,
HttpContext context) throws ProtocolException {
return response.getStatusLine().getStatusCode() == 302;
}
@Override
public HttpUriRequest getRedirect(HttpRequest request,
HttpResponse response, HttpContext context)
throws ProtocolException {
//String cookieValue = response.getFirstHeader("Set-Cookie").getValue();
String location = response.getFirstHeader("location").getValue();
HttpUriRequest request_= new HttpGet(location);
return request_;
}}).build()))
.build();
有了这个,我可以访问任何(私人)网址。我认为cookie数据会自动添加。也许你应该重写getRedirect(),isRedirected()函数来传递你的特殊需求。
答案 3 :(得分: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());
}
答案 4 :(得分:0)
我已经编辑了我之前的回答,因为您在调用登录休息api时很可能使用POST / PUT,并且OkHttp会在重定向之前将任何非GET或HEAD请求转换为GET请求,这可能不会为你工作。
目前OkHttp缺少禁用重定向的功能,但我已经提交了拉取请求。如果该拉取请求被接受,它应该允许您禁用重定向,让您有机会暂时自行处理此用例。