Как сделать http-пост, используя apache httpclient с веб-аутентификацией? - PullRequest
4 голосов
/ 27 сентября 2011

Я искал много для этого и не смог найти достойного решения.Тот, кто использует провайдер учетных данных, является плохим, так как он удваивает количество вызовов по сравнению с тем, что требуется, то есть он запускает запрос, получает 401 и только затем запускает запрос с учетными данными веб-аутентификации.

Любой, кто имеетИспользовал httpclient библиотеку Android для успешного выполнения http-запросов на URL-адрес за веб-аутентификацией?

1 Ответ

5 голосов
/ 27 сентября 2011

Для HttpClient 4.0.x вы используете HttpRequestInterceptor для включения упреждающей аутентификации - поскольку класс AndroidHttpClient не предоставляет метод addRequestInterceptor(..), вам, вероятно, придется использовать класс DefaultHttpClient.

Этот пример рассылает спам user1 / user1 на любой интересующий сервер.Отрегулируйте AuthScope, если вам небезразличен хотя бы один бит о безопасности.

DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user1", "user1"));
client.addRequestInterceptor(new HttpRequestInterceptor() {
    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
        AuthState state = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
        if (state.getAuthScheme() == null) {
            BasicScheme scheme = new BasicScheme();
            CredentialsProvider credentialsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
            Credentials credentials = credentialsProvider.getCredentials(AuthScope.ANY);
            if (credentials == null) {
                throw new HttpException();
            }
            state.setAuthScope(AuthScope.ANY);
            state.setAuthScheme(scheme);
            state.setCredentials(credentials);
        }
    }
}, 0); // 0 = first, and you really want to be first.
...