Ошибка аутентификации при использовании 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 устраняет проблему