gpt4 book ai didi

java - 身份验证错误 : Unable to respond to any of these challenges: {} Android - 401 Unauthorized

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:46 25 4
gpt4 key购买 nike

身份验证错误:无法响应以下任何挑战:{} Android - 401 未经授权

我引用了这个链接 Authentication Error when using HttpPost with DefaultHttpClient on Android

我正在开发 Drupal 支持的 android 应用程序。因为我正在将数据从 android 应用程序发送到 drupal 网站 - JSON 格式的 web 服务。现在我可以从 Drupal web 服务读取 JSON 数据并将其写入我的 android 应用程序。但是在 drupal 上从 android 编写时遇到问题,它会生成带有状态代码的响应

401 Unauthorized

它从 android native 应用程序生成 401 ,而从 phonegap-from android 当我启动 AJAX 请求时它完美地工作并在 drupal 网站上写一篇文章或页面。所以这意味着 web 服务可以完美地工作 &

my phonegap android app works perfectly there is problem with Android native JAVA application I am running my android application on 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 =============>      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 的各种方法。在这段时间里,我做了一些研究并在谷歌上搜索并发现了一些有趣的东西。

第一 我发现 Android-Google 官方不推荐我在代码中使用的 Apache HttpClient。检查此链接。在来自 Dalvik 团队的 Jesse Wilson 的链接消息中。因为他们建议使用 HttpURLConnection 而不是 DefaultHttpClient 并且还写道 Android 团队将不再开发 Apache httpclient 。所以它是我使用的旧版本。

http://android-developers.blogspot.in/2011/09/androids-http-clients.html

第二 我从这个链接中找到的东西。它表明 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 on Android

What version of Apache HTTP Client is bundled in Android 1.6?

从这些链接中,我得出一个结论,如果我们将 Apache HttpClient 升级到最新的稳定版本,那么这个问题就可以解决。

但这根本不可能,因为 Android Team 已正式停止对 Apache httpclient 的支持。

有了这个链接就可以解决了。我还没有尝试过,但我正在努力。

它是可以帮助升级Android中的httpclient版本的库。

http://code.google.com/p/httpclientandroidlib/

另一个解决方案可能是使用 HttpURLConnection 。我也在研究它。

但是这里的大多数人在 stackoverflow 和 Internet 上似乎都在 Android 上使用 DefaultHttpCLient。当然,它也在我的整个应用程序中与我合作,包括登录、注册、从服务器和 session 读取以及其他功能。只是它不能直接将一些文章发布到我的服务器-Drupal 网站。在服务器上注册用户期间,它与 POST 请求完美配合。

那么 friend 们,对此有什么建议吗?为什么它不适用于发布文章?

最佳答案

为什么它可以在 PhoneGap 而不是 Java 中运行。 PhoneGap 在 Web 容器中运行该应用程序,因此已经过身份验证 - 并且您拥有所有正确的 cookie。 AJAX 将共享同一个 session ,一切都“正常工作”。

但是 HTTPClient 是完全不同的 - 您正在启动一个全新的 HTTP session ,并且一切都必须正确。

关于 HTTP Auth 工作原理的一些评论:

有几种 HTTP 身份验证方法 - 由网络服务器选择。在继续之前,请检查您的 Drupal 配置以确定它是否:

(另请注意,Web 容器具有“智能”,能够根据服务器的请求尝试不同的身份验证方法,所有这些都在幕后进行)

同时检查 Drupal 网络日志。一些提示:

  • 您是否看到 HTTPClient 连接完全。并且是指向正确资源的 URL。从服务器的角度总是值得检查...
  • 是否转到了正确的服务器?可能出错的示例之一:您是否在使用 IPURL 中针对多宿主 Web 服务器的地址,因此请求会发送到错误的服务器?
  • 检查客户端预先发送的身份验证类型是否正确(基本、摘要、NTLM)

如果这有帮助,请告诉我。如果没有,您可以根据这篇文章提供更多详细信息,我可以跟进更多建议。

关于java - 身份验证错误 : Unable to respond to any of these challenges: {} Android - 401 Unauthorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11878896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com