Ho utilizzato HTTPClient versione 4.1.2 per provare ad accedere a un'API REST su HTTP che richiede l'autenticazione di base. Ecco il codice client:HTTPClient invia due richieste quando si utilizza l'autenticazione di base?
DefaultHttpClient httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager());
// Enable HTTP Basic Auth
httpClient.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials(this.username, this.password));
HttpHost proxy = new HttpHost(this.proxyURI.getHost(), this.proxyURI.getPort());
httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);
Quando costruisco una richiesta POST
, in questo modo:
HttpPost request = new HttpPost("http://my/url");
request.addHeader(new BasicHeader("Content-type", "application/atom+xml; type=entry")); // required by vendor
request.setEntity(new StringEntity("My content"));
HttpResponse response = client.execute(request);
vedo in Charles Proxy che ci sono due richieste di essere inviati. Uno senza l'intestazione Authorization: Basic ...
e uno con esso. Il primo fallisce con un 401, come ci si aspetterebbe, ma il secondo va bene con un 201.
Qualcuno sa perché questo accade? Grazie!
EDIT:
Vorrei chiarire che ho già guardato this question, ma come potete vedere ho impostare la AuthScope
allo stesso modo e che non ha risolto il mio problema. Inoltre, sto creando un nuovo HttpClient
ogni volta che ho fatto una richiesta (anche se io uso lo stesso ConnectionManager
), ma anche se io uso lo stesso HttpClient
per più richieste, il problema persiste ancora.
EDIT 2:
Quindi sembra che quello che stava suggerendo @LastCoder è il modo per farlo. Vedere this answer per un'altra domanda. Il problema deriva dalla mia scarsa conoscenza delle specifiche HTTP. Quello che sto cercando di fare è chiamato "autenticazione preventiva" e lo HttpClient
docs mention it here. Per fortuna, la risposta di cui sopra è un modo molto più breve e più pulito per farlo.
Ho notato la stessa cosa che si verificava quando si utilizzava soap-ui anche se le credenziali erano state specificate. – Harindaka
Mi chiedo se questo comportamento sia normale. Il client effettua una richiesta http non assumendo alcuna autenticazione e viene quindi detto (tramite il 401) che è necessaria l'autenticazione di base. In teoria, l'autenticazione di base potrebbe essere effettuata in modo preventivo, ma altri schemi di autenticazione (ad esempio digest) richiedono una negoziazione aggiuntiva – seand
@seand Si sa che in realtà l'ho considerato, ma non so se questo è integrato nel protocollo HTTP o qualcosa del genere. – daveslab