0

我在我的 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):在 org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85) 06-05 10:12:55.969: W/System.err(23843): 在 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): 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 06-05 10:12:55.969: W/System.err (23843): 在 org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 06-05 10:12:55.975: W/ System.err(23843): 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 06-05 10:12:55.975: W/System.err(23843): 在 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): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12: 55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)错误(23843):在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)06-05 10:12:55.975:W/System.err(23843):在 org.apache.http.protocol .HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/ System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache .http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)错误(23843):在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)06-05 10:12:55.975:W/System.err(23843):在 org.apache.http.protocol .HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/ System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache .http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)doReceiveResponse(HttpRequestExecutor.java:279) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 06-05 10: 12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504) 06-05 10:12:55.975: W/System.err(23843 ): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/System.err(23843): 在 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 )doReceiveResponse(HttpRequestExecutor.java:279) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 06-05 10: 12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504) 06-05 10:12:55.975: W/System.err(23843 ): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/System.err(23843): 在 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 )执行(HttpRequestExecutor.java:121)06-05 10:12:55.975:W/System.err(23843):在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504)06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/System.err (23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http。 impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)执行(HttpRequestExecutor.java:121)06-05 10:12:55.975:W/System.err(23843):在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:504)06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-05 10:12:55.975: W/System.err (23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http。 impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)java:555) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12: 55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)java:555) 06-05 10:12:55.975: W/System.err(23843): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-05 10:12: 55.975: W/System.err(23843): 在 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();

然后它工作正常。有任何想法吗?

4

1 回答 1

0

由于一个请求需要基本身份验证凭据,并且显然调用setCredentials()会导致错误,因此最好的办法可能是根本不使用凭据提供程序,并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);
    }
于 2012-06-05T02:44:37.923 回答