【问题标题】:How to use AndroidHttpClient (API Level 8) and UsernamePasswordCredentials?如何使用 AndroidHttpClient (API Level 8) 和 UsernamePasswordCredentials?
【发布时间】:2011-01-29 00:33:25
【问题描述】:

目前我正在使用带有 ThreadSafeClientConnManager 的 DefaultHttpClient。这很好用,但我想用 AndroidHttpClient 替换它。不幸的是,我无法添加当前对我很重要的 UsernamePasswordCredentials。任何人都可以提供提示或解决方案吗?

【问题讨论】:

    标签: android httpclient


    【解决方案1】:

    您需要使用HttpRequestInterceptor 类进行身份验证。

    这是一个例子

    HttpRequestInterceptor httpRequestInterceptor = new HttpRequestInterceptor() {
        public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
            AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
            CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(
                    ClientContext.CREDS_PROVIDER);
            HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
    
            if (authState.getAuthScheme() == null) {
                AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort());
                Credentials creds = credsProvider.getCredentials(authScope);
                if (creds != null) {
                    authState.setAuthScheme(new BasicScheme());
                    authState.setCredentials(creds);
                }
            }
        }    
    };
    

    【讨论】:

    • 这开启了一个新问题:如何将拦截器添加到AndroidHttpClient?
    • 你能告诉我你为什么要使用AndroidHttpClient吗?
    • 嘿塔梅。一方面代码对我来说看起来更干净,另一方面我尝试使用标准类而不是编写和维护我的一个。这些理由有效吗?
    • 如果你想使用标准类使用HttpClient
    • 你没有得到我。我不是在谈论标准类,而是在谈论 selfwriten 代码。除非 AndroidHttpClient 确实提供线程安全的连接管理器、连接池并正在监视内存泄漏,否则它会消除我必须自己维护的代码。
    【解决方案2】:

    我知道这个问题已经过时了,但为了让遇到此问题的人受益(就像我所做的那样),您可以使用 HttpGet 对象自己滚动标题。像这样:

    httpGet.addHeader("Authorization", "Basic " + Base64.encode(username+":"+password));
    

    【讨论】:

    • Base64类型的encode(byte[], int)方法不适用于参数(String)..
    【解决方案3】:

    对 Saad Farooq 的回答进行了一些改进,以下代码对我有用。

    final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
    
    getRequest = new HttpGet(url);
    
    getRequest.addHeader("Authorization", "Basic " + Base64.encodeToString(new
                    String(username + ":" + password).getBytes(), Base64.NO_WRAP));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2012-06-12
      • 2011-07-14
      • 2015-11-12
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多