身份验证错误:无法响应以下任何质询:{} Android - 401 Unauthorized

2024-04-30

身份验证错误:无法响应以下任何质询:{} Android - 401 Unauthorized

我已从此链接参考在 Android 上使用 HttpPost 和 DefaultHttpClient 时出现身份验证错误 https://stackoverflow.com/questions/6114455/authentication-error-when-using-httppost-with-defaulthttpclient-on-android

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

401 未经授权

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

我的phonegap android应用程序运行完美,但Android本机JAVA应用程序有问题 我正在 Android2.3.4 -> Samsung Galaxy 上运行我的 Android 应用程序 S Plus - 三星 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;

});

=================================================== ===============================

Edit :

我为 Apache httpclient 尝试了各种方法来解决我的错误。在这段时间里,我做了一些研究并在 google 上搜索,发现了一些有趣的东西。

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

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

2nd我从这个链接中找到的东西。它表明Android 附带了 Apache 的 HttpClient 4.0 Beta2,它在基本身份验证方面存在缺陷。我使用的身份验证方法是 HttpClient 3.x ,我是从此链接中找到的。 检查链接。http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

所以版本问题。

http://dlinsin.blogspot.in/2009/08/http-basic-authentication-with-android.html 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/ http://ogrelab.ikratko.com/using-newer-version-of-httpclient-like-4-1-x/

Android 上的 Apache HttpClient 4.1 https://stackoverflow.com/questions/3577035/apache-httpclient-4-1-on-android

Android 1.6 中捆绑了哪个版本的 Apache HTTP 客户端? https://stackoverflow.com/questions/2618573/what-version-of-apache-http-client-is-bundled-in-android-1-6

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

但这是不可能的,因为 Android 团队已经正式停止了对 Apache httpclient 的支持。

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

这是一个可以帮助升级Android中的httpclient版本的库。

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

另一种解决方案可以使用HttpURL连接.我也在努力。

但 stackoverflow 和互联网上的大多数人似乎都在使用默认Http客户端与安卓。当然,它也在我的整个应用程序中与我一起工作,包括登录、注册、从服务器和会话读取以及其他功能。只是它不能直接将一些文章发布到我的服务器 Drupal 网站。 在服务器上注册用户期间,它与 POST 请求完美配合。

那么朋友们,对此有什么建议吗?为什么它不能仅用于发布文章?


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

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

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

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

  • 基本身份验证(用户名和密码)。每个人和他们的狗都支持这一点,但这是非常不安全的。看http://en.wikipedia.org/wiki/Basic_access_authentication http://en.wikipedia.org/wiki/Basic_access_authentication更多细节
  • 摘要(使用 MD5 的用户名和质询/响应哈希值。这更安全,但也更复杂。请注意,MD5 现在通常被认为很弱。许多库都支持它,包括 Apache。请参阅http://en.wikipedia.org/wiki/Digest_access_authentication http://en.wikipedia.org/wiki/Digest_access_authentication更多细节
  • NTLM(Kerberos/SPEGNO 的变体)在 IIS 上实现。 Java 通常不支持这一点,尽管 HTTPClient 确实声称支持 - 但使用不同的 Credentials 对象。看http://hc.apache.org/httpclient-3.x/authentication.html#NTLM http://hc.apache.org/httpclient-3.x/authentication.html#NTLM

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

另请检查 Drupal 网络日志。一些提示:

  • 你看到 HTTPClient 连接了吗at all。 URL 是否指向正确的资源。总是值得检查从服务器的角度...
  • 它是否发送到了正确的服务器?可能出现问题的一个例子:您是否使用 IP URL 中的地址针对多宿主 Web 服务器,因此请求会发送到错误的服务器?
  • 检查客户端抢先发送的身份验证类型是否正确(basic、digest、NTLM)

让我知道这是否有帮助。如果没有,您可以根据这篇文章提供更多详细信息,我可以跟进更多建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

身份验证错误:无法响应以下任何质询:{} Android - 401 Unauthorized 的相关文章

  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • Azure 应用服务在配置中添加字符串数组

    Net core 应用程序并在 Azure 应用服务中部署该应用程序 在我的应用程序中 我有一个包含以下内容的应用程序 settings json 文件 Roles Roles Admins Users 我的 ARM 模板中有以下配置 参数
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • Ionic Facebook Api 无效密钥哈希

    我无法让我的应用程序允许 Facebook 登录 每次用户尝试登录 Facebook 并使用他们的 FB 验证我的应用程序时 都会出现以下错误 无效的密钥哈希 它们的密钥哈希 xxxxxxxxxx 与任何存储的密钥哈希不匹配 配置您的应用程
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet

随机推荐

  • 在 Google App Engine 上运行的 Spring Boot Web 应用程序 - 引发 jetty 异常

    当我执行时gradlew appengineRun 我一直得到 Starting a Gradle Daemon subsequent builds will be faster Mar 26 2018 5 47 48 PM java ut
  • 来自 alpine 软件包存储库的 Numpy 无法导入 c 扩展

    我正在制作一个需要 pandas 和 numpy 的 docker 映像 但通过 pip 安装大约需要 20 分钟 这对于我的用例来说太长了 然后我选择从 alpine 软件包存储库安装 pandas 和 numpy 但似乎无法正确导入 n
  • Java日期格式转换

    我目前正在从请求对象中提取三个表单字段输入 日 月 年 该月的第 11 天为 Day 11 12 月为 12 月 今年将是 2010 年 我需要将其转换为 Java Date 对象 但由于发生了很多变化 我不确定将其存储在 java 对象中
  • Code::Blocks 中的单个项目中有多个主要 C++ 文件?

    我不经常写代码 有时我连续 6 个月每天编写代码 然后长达 2 年不编写代码 这种方法迫使我保留一堆我 以及其他更好的程序员 编写的代码或参考代码 时隔很长一段时间 我在写代码时都会提到这个 库 我读了它 我执行了它 这对我精神焕发有很大帮
  • 查找 system.out.println 代码中的位置

    假设我正在一个非常大的项目中工作 并且注意到有一个空的打印行 所以我假设有一个 System out println 位于代码中的某个位置 除了在整个项目中搜索所有出现的 System out println 之外 我该如何尝试找出它在哪里
  • 在 C++ 中类继承的情况下强制延迟方法解析

    考虑以下类结构 class foo public int fun cout lt lt in foo lt lt endl class bar class1 public foo public int fun cout lt lt in b
  • 编译 XNA 项目时,无法执行请求的操作错误

    第二次编译项目时 出现以下错误消息 我必须关闭 VS 2010 重新加载时它会编译 如果我做出改变 那么问题又回来了 无法复制文件 obj x86 Debug MyFile dll 无法对打开的用户映射部分的文件执行请求的操作 我因为另一个
  • Swift NSPredicate 不在

    我有一个包含 X 个项目的数组 我需要通过 uid 过滤掉特定项目 我写了以下谓词 我认为它是正确的 我面临的问题是 Swift 编译器只允许我使用接受 argumentArray 的初始化程序 let uids 34885a9f0897f
  • 首选的跨平台 IPC Perl 模块是什么?

    我想创建一个简单的 IO 对象 它代表一个向另一个程序打开的管道 我可以在应用程序运行时定期写入另一个程序的 STDIN 我希望它是防弹的 因为它可以捕获所有错误 并且是跨平台的 我能找到的最佳选择是 open sub io read lo
  • 如何避免 Selenium 中的“StaleElementReferenceException”?

    我正在使用 Java 实现大量 Selenium 测试 有时 我的测试由于以下原因失败StaleElementReferenceException https developer mozilla org en US docs Web Web
  • App Store 上是否允许嵌入 dylib 的 iOS 8 应用程序?

    iOS 8 现在支持动态框架 是否意味着 App Store 提交允许这样做 似乎以前的开发人员能够在内部应用程序中使用 dylib 但在提交到 App Store 的内容中使用它们会导致您被拒绝 情况仍然如此 还是 iOS 8 中的这一更
  • 如何在快速人工智能中获得给定测试集的预测并计算准确性?

    我正在尝试加载由导出的学习者learn export 我想针对测试集运行它 我希望我的测试集有标签 以便我可以测量其准确性 这是我的代码 test src TextList from df df path cols texts split
  • 重新审视混合字符串值的字母数字排序

    请注意 我之前提出了一个非常相似的问题 但要求已发生变化 对混合字符串值进行字母数字排序 https stackoverflow com questions 3842719 alphanumeric sort on mixed string
  • TypeScript 中多个互斥参数

    给定以下 JavaScript 函数 function x foo fooId bar barId 我想将其转换为 TypeScript 以便调用者必须传入foo or fooId 但不能两者兼而有之 同样对于bar and barId 例
  • 在 python 中将 blob 保存到文件中

    我正在尝试将通过 ajax 发送的 blob 保存为 python 中的文件 以前经历过这个Python 如何在二进制和 Base 64 之间相互转换 https stackoverflow com questions 5305456 py
  • 如何配置 Ransack Rails Gem 以添加 NULLS LAST 进行排序

    我希望兰萨克总是添加NULLS LAST这会将空值放在排序列的最后 有办法做到这一点吗 我在 github 上开了一个问题 https github com activerecord hackery ransack issues 443 h
  • 从 Windows 命令行连接到 websocket

    是否可以从 Windows 命令行连接到 websocket 我已经从 Mac 终端使用了 WSCAT 但我似乎找不到替代方案 任何帮助 将不胜感激 Windows 中没有内置可与 WebSocket 配合使用的工具 虽然你可以使用teln
  • 在 Java 中从复杂的 HTML 表格中提取数据到二维数组

    如何转换 HTML 表格带有 colspan 和 rowspanJava中的二维数组 矩阵 我在 Python 和 jQuery 中找到了很好的解决方案 但在 Java 中却没有 只有通过 jsoup 的非常简单的表 XSLT 有一种很好的
  • R——对缺失值的二维数据集进行插值的方法

    我目前正在使用 Akima 插值例程来进行二维线性插值 我目前正在尝试通过排除不良数据点和依赖于它们的插值来尽可能地进行线性插值 我不想做任何样条拟合 只是线性插值 我可以想出两种使用现有的 akima 包来做到这一点的方法 通过将二维数据
  • 身份验证错误:无法响应以下任何质询:{} Android - 401 Unauthorized

    身份验证错误 无法响应以下任何质询 Android 401 Unauthorized 我已从此链接参考在 Android 上使用 HttpPost 和 DefaultHttpClient 时出现身份验证错误 https stackoverf