我在我的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();
然后它工作正常。有什么想法吗?
答案 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);
}