2012-06-04 19 views
0

我在我的android項目上使用OAuth2。這個想法是使用與ThreadSafeClientConnManager一起使用的單例HttpClient。指定單個請求使用憑證與HttpClient

對於一個正常的服務器請求,我們構造一個Authorization頭併發送它。標題由從服務器接收的值構造而成。這工作正常。然而,每15分鐘我們必須從服務器獲取新的值來構造標題。要接收這些值,我必須像這樣設置憑據。

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

爲了這個工作,我必須設置和新的DefaultHttpClient。如果我使用原始單身httpclient,我收到一些錯誤。我的問題是..是否可以設置憑據只用於這一個請求?

我注意到有一個AuthScope。主機和端口不適合這個,但也許是領域?我找不到任何能告訴我什麼是領域或如何使用它的東西。

10月6日至5日:12:55.969:W/System.err的(23843): org.apache.http.NoHttpResponseException:目標服務器無法 響應10月6日至5日: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.er R(23843):在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 10月6日至5日:12:55.969:W/System.err的(23843):在 有機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 1 0: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) 十月6日至5日:12:55.975:W/System.err的(23843):在 組織.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

作爲一個請求需要基本身份驗證憑據,顯然調用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); 
    } 
+0

我更新,以便顯示錯誤,當我試試這個方法。 是的我正在使用它來請求訪問令牌或刷新令牌。我們正在遵循這個草案http://tools.ietf.org/pdf/draft-ietf-oauth-v2-25.pdf – jiduvah

+0

顯然,服務器沒有響應。你確定你要發送正確的標題嗎?您發送的標題究竟如何?服務器期待什麼? –

+0

請求訪問/刷新令牌時不需要標頭。服務器期望設置憑證並將實體放入發佈請求中。如果我將1個HttpClient用於資源服務器的實際請求,另一個用於發送請求以獲取訪問令牌,則它可以正常工作。不過,我想使用1個httpclient作爲單例。 – jiduvah

相關問題