Ich versuche, die Funktionalität dieses Curl-Befehls in Java nachzuahmen:
curl --basic --user username:password -d "" http://ipaddress/test/login
Ich habe das Folgende mit Commons HttpClient 3.0 geschrieben, aber irgendwie bekam ich eine 500 Internal Server Error
vom Server. Kann mir jemand sagen, ob ich etwas falsch mache?
public class HttpBasicAuth {
private static final String ENCODING = "UTF-8";
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
HttpClient client = new HttpClient();
client.getState().setCredentials(
new AuthScope("ipaddress", 443, "realm"),
new UsernamePasswordCredentials("test1", "test1")
);
PostMethod post = new PostMethod(
"http://address/test/login");
post.setDoAuthentication( true );
try {
int status = client.executeMethod( post );
System.out.println(status + "\n" + post.getResponseBodyAsString());
} finally {
// release any connection resources used by the method
post.releaseConnection();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Und ich habe später einen Commons HttpClient 4.0.1 ausprobiert, aber immer noch den gleichen Fehler:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
public class HttpBasicAuth {
private static final String ENCODING = "UTF-8";
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials("test1", "test1"));
HttpPost httppost = new HttpPost("http://host:post/test/login");
System.out.println("executing request " + httppost.getRequestLine());
HttpResponse response;
response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
if (entity != null) {
entity.consumeContent();
}
httpclient.getConnectionManager().shutdown();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
java
http
apache-commons
Legende
quelle
quelle
Antworten:
Haben Sie dies versucht (mit HttpClient Version 4):
quelle
java.util.Base64
ab Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Ok, das funktioniert. Nur für den Fall, dass jemand es will, hier ist die Version, die für mich funktioniert :)
quelle
Base64Encoder
. Jonas, kannst du bitte das volle Glas geben? Wie lautet auch der vollqualifizierte KlassennameBase64Encoder
?Base64Encoder
Look hier . Für denBase64
Blick in commons-codec-1.6.jar in 4.2.5.zip bei Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
Dies ist der Code aus der oben akzeptierten Antwort, wobei einige Änderungen in Bezug auf die Base64-Codierung vorgenommen wurden. Der folgende Code wird kompiliert.
quelle
Ein kleines Update - hoffentlich nützlich für jemanden - es funktioniert für mich in meinem Projekt:
Ich verwende die nette Public Domain-Klasse Base64.java von Robert Harder (Danke Robert - Code hier verfügbar: Base64 - herunterladen und in Ihr Paket einfügen ).
und laden Sie eine Datei (Bild, Dokument usw.) mit Authentifizierung herunter und schreiben Sie auf die lokale Festplatte
Beispiel:
quelle
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
wie in dieser Antwort auf dieser Seite beschrieben ersetzt werdenHier sind einige Punkte:
Sie könnten ein Upgrade auf HttpClient 4 in Betracht ziehen (im Allgemeinen, wenn Sie können, glaube ich nicht, dass Version 3 noch aktiv unterstützt wird).
Ein 500-Statuscode ist ein Serverfehler. Daher kann es hilfreich sein, zu sehen, was der Server sagt (Hinweise im Antworttext, den Sie drucken?). Obwohl dies möglicherweise von Ihrem Client verursacht wird, sollte der Server auf diese Weise nicht ausfallen (ein 4xx-Fehlercode wäre besser geeignet, wenn die Anforderung falsch ist).
Ich denke,
setDoAuthentication(true)
ist die Standardeinstellung (nicht sicher). Es könnte nützlich sein, zu versuchen, dass die vorbeugende Authentifizierung besser funktioniert:Ansonsten besteht der Hauptunterschied zwischen
curl -d ""
und dem, was Sie in Java tun, darinContent-Length: 0
, dass Curl zusätzlich auch sendetContent-Type: application/x-www-form-urlencoded
. Beachten Sie, dass Sie in Bezug auf das Design wahrscheinlichPOST
trotzdem eine Entität mit Ihrer Anfrage senden sollten .quelle
Vielen Dank für alle Antworten oben, aber für mich kann ich die Base64Encoder-Klasse nicht finden, also sortiere ich meinen Weg trotzdem.
Eine weitere Sache habe ich auch versucht
Es funktioniert NICHT, da es einen String zurückgibt, mit dem es fast identisch ist
aber beenden Sie mit "\ r \ n", dann gibt der Server "schlechte Anfrage" zurück.
Auch der folgende Code funktioniert, eigentlich sortiere ich das zuerst aus, aber aus irgendeinem Grund funktioniert er NICHT in einer Cloud-Umgebung (sae.sina.com.cn, wenn Sie wissen möchten, dass es sich um einen chinesischen Cloud-Dienst handelt). Sie müssen daher den http-Header anstelle der HttpClient-Anmeldeinformationen verwenden.
quelle
während der Verwendung des Header-Arrays
quelle
Verwenden Sie für HttpClient beispielsweise immer HttpRequestInterceptor
quelle
HttpBasicAuth funktioniert bei mir mit kleineren Änderungen
Ich benutze Maven-Abhängigkeit
Kleinere Änderung
quelle
Ein einfacher Weg , sich mit einem HTTP-POST anzumelden, ohne Base64-spezifische Aufrufe auszuführen, ist die Verwendung des HTTPClient BasicCredentialsProvider
quelle