Muszę porozmawiać z niezrozumiałym serwerem internetowym, który wymaga uwierzytelnienia. Jeśli nie dostarczę poświadczeń, wyświetli się formularz logowania. Jeśli jednak dostarczę niezamówione poświadczenia Basic Authentication, przejdę bezpośrednio do żądanej treści.Uwierzytelnianie HTTP za pomocą komponentów Apache HTTP: wymuszanie wysyłania wiadomości
wget
obsługuje to bezpośrednio:
# this fails and downloads a form:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh
# this works and downloads the document:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge
Teraz moje pytanie: W jaki sposób można dokonać pobrania w języku Java z wykorzystaniem komponentów HTTP Apache?
Oto, co dostałem do tej pory. (Jest również pełnomocnikiem w miejscu, a używam -Y on
w wget
i mam pasujący https_proxy
zmienną środowiskową.)
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import java.net.URI;
// ...
DefaultHttpClient hc = new DefaultHttpClient();
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port));
URI uri = new URI("https://weird.egg/data.txt");
hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh"));
hc.execute(new HttpGet(uri)); // etc
Jednak tylko skończyć ze strony formularza logowania, a nie rzeczywista dokumentu. Podejrzewam, że DefaultHttpClient nie wysyła poświadczeń niezamawianych, tak jak robi to wget
. Czy istnieje sposób, aby program Java wysłał poświadczenia?
Świetny pomysł, dzięki. Rozwiązanie ramowe też mi nie pasowało. Ręczne dodawanie nagłówka działało. –
Dzięki. Miałem ten sam problem z klientem Maven HTTP Wagon i rozwiązałem go ręcznie, dodając nagłówek. –
w dzisiejszych czasach można po prostu użyć 'java.util.Base64.getEncoder(). EncodeToString (coś)', nie trzeba polegać na 'import org.apache.commons.codec.binary.Base64;' – eis