Ошибка аутентификации при использовании HttpPost с DefaultHttpClient на Android - PullRequest
12 голосов
/ 24 мая 2011

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

Кроме того, я попытался использовать HttpPost в написанном мною простом php-скрипте, который ищет параметр 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

РЕДАКТИРОВАТЬ: Ладно, я ничего не получаю, поэтому я подумал, что если я направлю вас к API, это может пролить некоторый свет, это 8Tracks API , и, как вы можете видеть, вам нужно передать ключ dev ( api_key) для всех запросов, и часть, на которой я застрял, использует https для входа пользователя с помощью: http://www.8tracks.com/sessions.xml" part.

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

Спасибо

Infinitifizz

Ответы [ 4 ]

12 голосов
/ 25 мая 2011

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

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

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

3 голосов
/ 25 января 2012

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

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

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

3 голосов
/ 24 мая 2011

Не нужно ли объявлять порт и протокол? Я просто обманываю этот код, поэтому, пожалуйста, не расстраивайтесь, если он не сразу компилируется правильно. Кроме того, я обычно предоставляю 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 здесь .

1 голос
/ 11 марта 2012

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

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

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

...