認証エラー: 次のチャレンジのいずれにも応答できません: {} Android - 401 Unauthorized
Android で DefaultHttpClient を使用して HttpPost を使用する場合、このリンク認証エラーから参照し ました。
私は Drupal に裏打ちされた Android アプリに取り組んでいます。その中で、Androidアプリからdrupal Webサイト(JSON形式のWebサービス)にデータを送信しています。これで、Drupal Web サービスから JSON データを読み取って、Android アプリケーションに書き込むことができます。しかし、android から drupal への書き込みで問題が発生し、ステータス コードで応答が生成されます。
401無許可
Androidネイティブアプリからは 401 が生成されますが、phonegap-from AndroidからはAJAXリクエストを開始すると完全に機能し、drupal Webサイトに記事またはページが書き込まれます。つまり、Webサービスは完全に機能します &
私のphonegap Androidアプリは完全に動作しますAndroidネイティブJAVAアプリケーションに問題がありますAndroid2.3.4でAndroidアプリケーションを実行しています-> 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 =============> org.apache.http.client.methods.HttpPost@4053c3c8
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 で検索したところ、興味深いことがわかりました。
Android-Google は、コードで使用している Apache HttpClientを公式に推奨していないことがわかりました。このリンクを確認してください。Dalvik チームの Jesse Wilson からのリンク メッセージ。彼らは DefaultHttpClient の代わりに HttpURLConnection を使用することを提案し、Android チームは Apache httpclient を開発しなくなるとも書いています。そのため、私が使用している古いバージョンです。
http://android-developers.blogspot.in/2011/09/androids-http-clients.html
このリンクから見つけた2番目のもの。基本認証に関しては、落とし穴がある Apache の HttpClient 4.0 Beta2 が Android に同梱されていることを示唆してい ます。 私が使用している認証方法は、このリンクから見つけた 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 を最新の安定バージョンにアップグレードすれば、この問題は解決できるという結論に達しました。
しかし、Android チームが Apache httpclient のサポートを正式に停止したため、これは直接的には不可能です。
このリンクで解決できる可能性があります。私はそれを試していませんが、私はそれに取り組んでいます。
Android の httpclient バージョンをアップグレードするのに役立つライブラリです。
他の解決策はHttpURLConnectionを使用することです。私もそれに取り組んでいます。
しかし、stackoverflow とインターネットのほとんどの人は、Android でDefaultHttpCLientを使用しているようです。そしてもちろん、ログイン、登録、サーバーとセッションからの読み取り、その他の機能を含むアプリケーション全体で私と一緒に働いています.ちょうどそれは私のサーバー-Drupal Webサイトに記事を直接投稿することでは機能していません. サーバーにユーザーを登録する際の POST リクエストと完全に連携します。
友達、これに関する提案はありますか?記事を投稿するだけで機能しないのはなぜですか?