Java 401使用HttpURLConnection Android时出现未经授权的错误?

Java 401使用HttpURLConnection Android时出现未经授权的错误?,java,android,json,http,http-headers,Java,Android,Json,Http,Http Headers,我们搜索了又搜索,似乎仍然无法解决这个问题。我们有一个REST web服务,正在尝试从我们的Android应用程序访问它。当从web浏览器或Chrome中的高级Rest客户端扩展访问web服务URL时,web服务URL起作用。我们的URL看起来像: http://10.52.1.1:8080/GPService/Tenants(Name=DefaultTenant)/Companies(Fabrikam,%20Inc.)/Items(128%20SDRAM).JSON 在浏览器中输入后,系统会

我们搜索了又搜索,似乎仍然无法解决这个问题。我们有一个REST web服务,正在尝试从我们的Android应用程序访问它。当从web浏览器或Chrome中的高级Rest客户端扩展访问web服务URL时,web服务URL起作用。我们的URL看起来像:

http://10.52.1.1:8080/GPService/Tenants(Name=DefaultTenant)/Companies(Fabrikam,%20Inc.)/Items(128%20SDRAM).JSON
在浏览器中输入后,系统会提示我们输入凭据。输入凭据后,将返回JSON结果

在我们的Android应用程序中,我们正在尝试以下操作:

    Authenticator.setDefault(new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("domain\\user", "password".toCharArray());
        }
    });

    URL url = new URL(urlstring);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(false);
    conn.setDoInput(true);
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(60000);
    InputStream istream = conn.getInputStream();
知道我们做错了什么吗?我们尝试了不同的方法,类似于此,但没有成功,我们不断得到错误

根据收到的评论:我们的服务使用NTLM身份验证


谢谢你的帮助

conn.setRequestPropertyAuthorization,基本+ Base64.encodeToStringusernameUsed:passwordUsed.getBytes,Base64.NO_WRAP


上面的代码对我有效。

我也有同样的问题。在我的例子中,我发送了一个编码为其中一个报头的时间戳。我正在测试的设备的时间设置为过去的时间,这导致授权失败


我知道这个帖子很旧。刚刚添加了我的经验,它可能对某些人有用

您的web服务正在使用哪种身份验证?表单还是基本?@JunedAhsan我们实际上使用的是NTLM身份验证。将该详细信息添加到原始问题。您是否在此处检查答案:。Android实际上没有实现NTLM的验证器的具体实现。@ErikNedwidek我们确实看了这个例子,但出于某种原因,它看起来甚至没有进入代码的验证器部分。我们在getPasswordAuthentication方法中放置了一个Print语句,并使用调试器执行它,我们甚至没有点击该语句/breakpoint.nods。是的,我相信这是意料之中的。PasswordAuthentication只是用户/密码对的持有者。Authenticator的具体实现在需要时调用getPassword。当HttpUrlConnection对象看到WWW-Authenticate:NTLM头时,它意识到它没有该方法的具体实现,并将连接保留为401。实际上,在重新阅读文档时,它说Android HttpUrlConnection只支持基本身份验证。