Ответ 1
Попробуйте использовать RedirectHandler
. Для возврата вашей пользовательской реализации из createRedirectHandler()
может потребоваться расширение DefaultHttpClient
.
Я подключаюсь к своему приложению AppEngine, используя библиотеку Apache HttpComponents. Чтобы аутентифицировать моих пользователей, мне нужно передать токен аутентификации вместе с адресом входа в систему (http://myapp.appspot.com/_ah/login?auth=...) И захватить файл cookie из заголовок ответа. Тем не менее, страница входа в систему отвечает кодом состояния перенаправления, и я не знаю, как остановить HttpClient от перенаправления, что помешает мне перехватить файл cookie.
Fwiw, фактический метод, который я использую для отправки запроса, находится ниже.
private void execute(HttpClient client, HttpRequestBase method) {
// Set up an error handler
BasicHttpResponse errorResponse = new BasicHttpResponse(
new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR");
try {
// Call HttpClient execute
client.execute(method, this.responseHandler);
} catch (Exception e) {
errorResponse.setReasonPhrase(e.getMessage());
try {
this.responseHandler.handleResponse(errorResponse);
} catch (Exception ex) {
// log and/or handle
}
}
}
Как мне остановить клиент от перенаправления?
Спасибо.
Обновление
В соответствии с приведенным ниже решением я сделал следующее после создания DefaultHttpClient client
(и перед передачей его методу execute
):
if (!this.followRedirect) {
client.setRedirectHandler(new RedirectHandler() {
public URI getLocationURI(HttpResponse response,
HttpContext context) throws ProtocolException {
return null;
}
public boolean isRedirectRequested(HttpResponse response,
HttpContext context) {
return false;
}
});
}
Более подробное, чем кажется, должно быть, но не так сложно, как я думал.
Попробуйте использовать RedirectHandler
. Для возврата вашей пользовательской реализации из createRedirectHandler()
может потребоваться расширение DefaultHttpClient
.
Вы можете сделать это с помощью http params:
final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
Метод не имеет javadoc, но если вы посмотрите на источник, вы увидите, что он устанавливает:
который управляет:
Определяет, следует ли автоматически обрабатывать переадресацию
Если версия 4.3.x HttpClient находится непосредственно в clientBuilder.
поэтому, когда вы создаете свой клиент:
CloseableHttpClient client = clientBuilder.disableRedirectHandling().build();
Я знаю его старый вопрос, но у меня тоже была эта проблема, и я хочу поделиться своим решением.
RedirectHandler кажется устаревшим, мне удалось автоматически отключить последующие ответы на перенаправление, изменив значение по умолчанию RedirectionStrategy для DefaultHttpClient.
httpClient.setRedirectStrategy(new RedirectStrategy() {
@Override
public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException {
return false;
}
@Override
public HttpUriRequest getRedirect(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException {
return null;
}
});
С другой стороны, это привязывает нас к конкретной реализации HttpClient, но выполняет эту работу.
представлен быстрый google: http://hc.apache.org/httpclient-3.x/redirects.html