我在我的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();
然後它工作正常。有任何想法嗎?
我更新,以便顯示錯誤,當我試試這個方法。 是的我正在使用它來請求訪問令牌或刷新令牌。我們正在遵循這個草案http://tools.ietf.org/pdf/draft-ietf-oauth-v2-25.pdf – jiduvah
顯然,服務器沒有響應。你確定你要發送正確的標題嗎?您發送的標題究竟如何?服務器期待什麼? –
請求訪問/刷新令牌時不需要標頭。服務器期望設置憑證並將實體放入發佈請求中。如果我將1個HttpClient用於資源服務器的實際請求,另一個用於發送請求以獲取訪問令牌,則它可以正常工作。不過,我想使用1個httpclient作爲單例。 – jiduvah