2009-08-31 10 views
34

Sto cercando di inviare un GET via di Android HttpURLConnection (importato dalla org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection), e dopo aver ricevuto la risposta, un IOException è gettata :IOException: "richiesta di autenticazione ricevuto è nullo" (Apache Harmony/Android)

in doRequestInternal(): "richiesta di autenticazione ricevuto è nullo"

Che cosa significa questo errore, e che cosa sta causando questo? Sto scrivendo i parametri OAuth sull'intestazione Autorizzazione, ma lo faccio anche in altre occasioni, senza problemi.

if (connection == null) { 
     connection = (HttpURLConnection) new URL(endpointUrl).openConnection(); 
     connection.setRequestMethod("GET"); 
    } 

    //... do some OAuth message signing 

    connection.connect(); 

    int statusCode = connection.getResponseCode(); // throws IOException 
+0

questo è lavoro per me http://stackoverflow.com/a/9894629/3758898 –

risposta

50

Ho scoperto il motivo.

Prima di tutto, per tutti coloro che non sono a conoscenza di ciò che questo significa errore (io certo non lo era): Questa eccezione viene generata se il server risponde con un 401. Molto intuitivo, se si considera che è stato gettato in getResponseCode() (iow non sei mai in grado di controllare te stesso per 401s, ma devi prendere questa IOException invece ...).

La causa effettiva per il 401 era che non ho inviato un codice di verifica OAuth dove era previsto a questo punto.

+0

Ciao Matthias, stavi usando l'API di twitter? – MounirReg

+1

no Ho riscontrato questo problema come parte dell'implementazione DefaultOAuthProvider per Signpost, che utilizza HTTPUrlConnection anziché Apache HttpClient. – Matthias

+0

E ti sei attenuto a Signpost? Sto avendo un sacco di problemi con questo su Android. –

13

Forse sarà utile per qualcuno ...

Questa eccezione significa solo intestazioni risposta malformati: non è stato trovato l'intestazione "WWW-Authenticate". Inoltre, le risposte a blocchi con codice 401 non sono supportate, quindi avrete bisogno dell'intestazione "Content-Length" (può essere zero).

+0

o intestazione "Autorizzazione" – Matthias

+4

Il client deve inviare l'intestazione "Autorizzazione" e se al server non sono piaciute le credenziali è necessario inviare di nuovo 'WWW-Authenticate'. Nel mio caso è il nostro server e inviava 'WWW-Authenticate' solo quando mancava l'header' Authorization'. Per correggere l'errore nell'oggetto abbiamo apportato una modifica sul lato server per inviare 'WWW-Authenticate' quando l'autorizzazione ha esito negativo. – katit

4

Basta aggiungere questa intestazione alla richiesta (in lato server):

WWW-Authenticate: None 
2

Si prega di notare che ci sono due approcci di autenticazione: HTTP Authentication e token-based authentication. Se si utilizza l'autenticazione HTTP, è necessario seguire le specifiche di riferimento: includere WWW-Authenticate sul lato server, utilizzare java.net.Authenticator localmente, ecc. Se si utilizza l'autenticazione basata su token, ovviamente è necessario utilizzare i cookie per archiviare il token e rendere in grado di mantenere vive le sessioni di lunga durata. In tal caso, inserire il codice successivo in android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

e non avrete problemi quando si riceve HTTP 401 dal server senza WWW-Authenticate campo intestazione.

Problemi correlati