指定单个请求以使用带有HttpClient的凭据

时间:2012-06-04 13:35:56

标签: android httpclient

我在我的android项目中使用OAuth2。我们的想法是使用与ThreadSafeClientConnManager一起使用的单例HttpClient。

对于服务器的正常请求,我们构造一个Authorization标头并发送它。标头由从服务器接收的值构成。这很好用。但是,每隔15分钟,我们必须从服务器获取新值以构建标头。要收到这些值,我必须像这样设置凭据。

client.getCredentialsProvider().setCredentials(
        new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
        new UsernamePasswordCredentials(creds.clientId, creds.clientSecret));

为了使其工作,我必须设置新的DefaultHttpClient。如果我使用原始的单例httpclient,我会收到一些错误。我的问题是..是否可以设置仅在这一个请求中使用的凭据?

我注意到有一个AuthScope。主机和端口不适合这个,但也许这个领域会?我找不到任何告诉我什么是领域或如何使用它的东西。

  

06-05 10:12:55.969:W / System.err(23843):   org.apache.http.NoHttpResponseException:目标服务器失败   回应06-05 10:12:55.969:W / System.err(23843):at   org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)   06-05 10:12:55.969:W / System.err(23843):at   org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)   06-05 10:12:55.969:W / System.err(23843):at   org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)   06-05 10:12:55.969:W / System.err(23843):at   org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)   06-05 10:12:55.969:W / System.err(23843):at   org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)   06-05 10:12:55.975:W / System.err(23843):at   org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

所以经过更多的测试后,我发现了问题所在。

我想配置一个像这样的池连接管理器

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
        new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(
        new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));


ClientConnectionManager conManager = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry);
    DefaultHttpClient httpClient = new DefaultHttpClient(conManager, new BasicHttpParams());

但是当像这样配置时,我得到上面的错误。如果我使用正常的默认httpclient,那么

 DefaultHttpClient httpClient = new DefaultHttpClient();

然后它工作正常。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于一个请求需要基本身份验证凭据,并且显然调用setCredentials()会导致错误,因此您可能最好不要使用凭据提供程序并手动设置Basic身份验证标头(使用setHeader() (仅在您需要时)。

编辑:以下是创建线程安全共享HttpClient实例的方法:

 DefaultHttpClient createHttpclient(int timeout) {
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setContentCharset(params,
                HTTP.DEFAULT_CONTENT_CHARSET);
        HttpConnectionParams.setConnectionTimeout(params, timeout);
        HttpProtocolParams.setUserAgent(params, "MyApp/1.0");
        ConnPerRoute connPerRoute = new ConnPerRouteBean(10);
        ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
        ConnManagerParams.setMaxTotalConnections(params, 20);

        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", PlainSocketFactory
                .getSocketFactory(), 80));
        final SSLSocketFactory sslSocketFactory = SSLSocketFactory
                .getSocketFactory();
        schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
        ClientConnectionManager cm = new ThreadSafeClientConnManager(params,
                schemeRegistry);

        return new DefaultHttpClient(cm, params);
    }