Ошибка аутентификации: невозможно ответить на любую из этих проблем: {} Android - 401 Несанкционированный
Я ссылался на эту ссылку Ошибка аутентификации при использовании HttpPost с DefaultHttpClient на Android
Я работаю над приложением Android в том, что поддерживается в Drupal. В этом я отправляю данные из приложения android на веб-сайт drupal - webservice в формате JSON. Теперь я могу читать данные JSON из веб-сервиса Drupal и записывать его в приложение для Android. Но столкнувшись с проблемой написания на drupal из android, он генерирует ответ со статусом
401 Несанкционированный
Из собственного приложения Android он генерирует 401, а из phonegap-from android, когда я запускаю запрос AJAX, он отлично работает и пишет статью или страницу на веб-сайте drupal. так что webservice отлично работает и
Android-приложение Android Android отлично работает, есть проблема с приложением JAVA для Android Я запускаю приложение для Android на Android2.3.4 → Samsung Galaxy S Plus - Samsung GT-I9001
вот мой код для java android.
==============================
String url = "XXX";
strResponse1 = makeWebForPostIdea(url,title,body);
public static String makeWebForPostIdea(String url, String title,String body)
{
JSONStringer jsonobject = null;
JSONObject json = null;
JSONObject jsonnode = null;
DefaultHttpClient client = new DefaultHttpClient();
Credentials creds = new UsernamePasswordCredentials("username", "password");
client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), creds);
HttpPost post = new HttpPost(url);
System.out.println("value of the post =============> "+post);
try {
JSONObject jsonvalue = new JSONObject();
jsonvalue.put("value", body.toString());
JSONArray array = new JSONArray();
array.put(jsonvalue);
jsonnode = new JSONObject();
jsonnode.put("und", array);
System.out.println("@@@@@@2 jsonnode=======>"+jsonnode.toString());
} catch (JSONException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
try {
jsonobject = new JSONStringer().array().object().key("und").object().key("0").object().key("value").value(body).endObject().endObject().endObject().endArray();
System.out.println("=============>"+jsonobject);
} catch (JSONException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("type","page"));
params.add(new BasicNameValuePair("title",title));
params.add(new BasicNameValuePair("language","und"));
params.add(new BasicNameValuePair("body",jsonobject.toString()));
System.out.println("value of the params =============> "+params);
UrlEncodedFormEntity formEntity = null;
try {
formEntity = new UrlEncodedFormEntity(params);
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
post.setEntity(formEntity);
try {
HttpResponse response = client.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("=========> statusCode post idea=====> "+statusCode);
if (statusCode == HttpStatus.SC_OK)
{
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
return iStream_to_String(is);
}
else
{
return "Hello This is status ==> :"+String.valueOf(statusCode);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static String iStream_to_String(InputStream is1) {
BufferedReader rd = new BufferedReader(new InputStreamReader(is1), 4096);
String line;
StringBuilder sb = new StringBuilder();
try {
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String contentOfMyInputStream = sb.toString();
return contentOfMyInputStream;
}
}
}
вот logcat, который я получаю.
08-09 12:41:29.063: I/System.out(336): value of the post =============> [email protected]
08-09 12:41:29.093: I/System.out(336): @@@@@@2 jsonnode=======>{"und": [{"value":"ddddddd"}]}
08-09 12:41:29.093: I/System.out(336): =============>[{"und":{"0":{"value":"ddddddd"}}}]
08-09 12:41:29.103: I/System.out(336): value of the params =============> [type=page, title=hhhh, language=und, body=[{"und":{"0":{"value":"ddddddd"}}}]]
08-09 12:41:30.913: W/DefaultRequestDirector(336): Authentication error: Unable to respond to any of these challenges: {}
08-09 12:41:30.913: I/System.out(336): =========> statusCode post idea=====> 401
08-09 12:41:30.924: I/System.out(336): =========> Response from post idea => Hello This is status ==> :401
Вот мой запрос PhoneGap Ajax, он отлично работает.
$('#page_node_create_submit').live('click',function(){
var title = $('#page_node_title').val();
//if (!title) { alert('Please enter a title.'); return false; }
var body = $('#page_node_body').val();
//if (!body) { alert('Please enter a body.'); return false; }
// BEGIN: drupal services node create login (warning: don't use https if you don't have ssl setup)
$.ajax({
url: "XXX",
type: 'post',
data: 'node[type]=page&node[title]=' + encodeURIComponent(title) + '&node[language]=und&node[body][und][0][value]=' + encodeURIComponent(body),
dataType: 'json',
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert('page_node_create_submit - failed to login');
console.log(JSON.stringify(XMLHttpRequest));
console.log(JSON.stringify(textStatus));
console.log(JSON.stringify(errorThrown));
},
success: function (data) {
$.mobile.changePage("index.html", "slideup");
}
});
// END: drupal services node create
return false;
});
=============================================== ==================================
Изменить:
Я пробовал различные методы для Apache httpclient для моей ошибки. За это время я провел некоторое исследование и обыскал в google и обнаружил некоторые интересные вещи.
1st, что я обнаружил, что Android-Google официально не рекомендует Apache HttpClient, который я использую в своем коде. Проверьте эту ссылку. В этом сообщении Link от Джесси Уилсон из команды Dalvik. В этом случае они предлагают использовать HttpURLConnection вместо DefaultHttpClient, а также писать, что команда Android больше не будет разрабатывать Apache httpclient. поэтому его более старая версия, которую я использую.
http://android-developers.blogspot.in/2011/09/androids-http-clients.html
2 вещь, которую я нашел в этой ссылке. Это говорит о том, что Android поставляется с Apache HttpClient 4.0 Beta2, у которого есть ловушка, когда дело доходит до Базовой аутентификации. Метод проверки подлинности, который я использую, имеет HttpClient 3.x, который я обнаружил по этой ссылке. проверьте ссылку. http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication
Итак, проблема с версией.
http://dlinsin.blogspot.in/2009/08/http-basic-authentication-with-android.html
Я также нашел некоторые ссылки с возможным решением этой проблемы.
http://ogrelab.ikratko.com/using-newer-version-of-httpclient-like-4-1-x/
Apache HttpClient 4.1 на Android
Какая версия HTTP-клиента Apache поставляется в Android 1.6?
Из этих ссылок я сделал вывод, что если мы обновим Apache HttpClient до последней стабильной версии, тогда эта проблема может быть решена.
Но это прямо невозможно, так как Android Team официально остановила поддержку Apache httpclient.
С помощью этой ссылки можно было бы решить. Я не пробовал, но я работаю над этим.
Это библиотека, которая может помочь в обновлении версии httpclient в Android.
Другим решением может быть использование HttpURLConnection. Я также работаю над ним.
Но большинство людей здесь, в stackoverflow и в Интернете, похоже, используют Android с DefaultHttpCLient. И, конечно же, он также работает со мной на протяжении всего моего приложения, включая логин, регистрацию, чтение с сервера и сеанса и другие функции. Просто он не работает с прямой публикацией какой-либо статьи на моем сервере Drupal. Он отлично работает с запросом POST при регистрации пользователя на сервере.
Итак, друзья, любые предложения по этому поводу? почему он не работает только с публикацией статьи?