Ошибка аутентификации при использовании HttpPost с DefaultHttpClient на Android

У меня возникает проблема с HttpClient. Я использую DefaultHttpClient() с HttpPost. Я использовал HttpGet со 100% -ным успехом, но теперь пытаюсь перейти на HttpPost, поскольку API REST, который я использую, требует параметров POST, а не GET. (Только для некоторых вызовов API, хотя я знаю, что вызовы GET работают нормально, поэтому это не ошибка API).

Кроме того, я попробовал использовать HttpPost на простой php script, я написал, что ищет параметр POST "var" и отгоняет его для экранирования, передавая эти параметры, как показано ниже:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    postMethod = new HttpPost("http://www.examplewebsite.com");

    nameValuePairs.add(new BasicNameValuePair("var", "lol"));

    try {
        postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        response = httpClient.execute(postMethod, responseHandler);
        Log.i("RESTMethod", response);
...

Проблема заключается в том, что, когда я пробовал и выполнял тот же вызов API (но с параметрами, явно измененными на параметры API), я получаю следующую ошибку:

Authentication error: Unable to respond to any of these challenges: {}

Страница, которую я запрашиваю, является страницей HTTPS, может ли это быть проблемой?

Но выполнение того же типа запроса POST на необработанной странице HTTP в API дает ту же ошибку, если я не прокомментирую часть StringEntity, а затем она запустится (но возвращает xml, и я хочу передать параметр для запроса данных в JSON).

Это кажется действительно странной проблемой (часть, отличная от https), но не может найти никакой помощи по этой проблеме, так что извините, если ответ отсутствует.

Любые идеи?

Спасибо заранее,

Infinitifzz

EDIT: Хорошо, я никуда не ушел, поэтому я подумал, что если бы я направил вас на API, он мог бы пролить свет, это 8Tracks API и, как вы можете видеть вам нужно передать ключ dev (api_key) для всех запросов, и я часть, на которую я застрял, использует https для входа пользователя в систему с помощью http://www.8tracks.com/sessions.xml" часть.

Надеюсь, это так или иначе поможет, потому что я в тупике.

Спасибо,

Infinitifizz

Ответ 1

Ошибка аутентификации: невозможно выполнить ответьте на любую из этих проблем: {}

Это сообщение об ошибке означает, что сервер ответил кодом состояния 401 (Unauthorized), но не смог предоставить один вызов auth (заголовок WWW-Authenticate), что делает невозможным автоматическое восстановление HttpClient от сбоя проверки подлинности.

Скорее всего, приложение ожидает некоторые мягкие учетные данные в форме HTML, заключенной в HTTP-запрос POST.

Ответ 2

Вам не нужно объявлять порт и протокол? Я просто прокручиваю этот код, поэтому, пожалуйста, не расстраивайтесь, если он не сразу компилируется правильно. Кроме того, я обычно поставляю UsernamePasswordCredentials в свой setCredentials(), но я думаю, что это то же самое.

HttpHost host = new HttpHost("www.foo.com", 443, "https");

// assemble your GET or POST

client.getCredentialsProvider().setCredentials(new AuthScope(host.getHostName(), host.getPort()));

HttpResponse response = client.execute(host, [HttpPost or HttpGet]);

Подробнее о setCredentials здесь.

Ответ 3

Вот как я столкнулся с аналогичной проблемой:

DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(username, password));

Спасибо Райану за правильное направление.

Ответ 4

Не указывая URL-адрес обратного вызова для моего приложения Twitter, я получил такую ​​же ошибку:

Authentication error: Unable to respond to any of these challenges: {oauth=WWW-Authenticate: OAuth realm="https://api.twitter.com"}

Установка URL-адреса обратного вызова в Twitter устраняет проблему