J'essaie d'imiter la fonctionnalité de cette commande curl en Java:
curl --basic --user username:password -d "" http://ipaddress/test/login
J'ai écrit ce qui suit en utilisant Commons HttpClient 3.0 mais j'ai fini par obtenir un message 500 Internal Server Error
du serveur. Quelqu'un peut-il me dire si je fais quelque chose de mal?
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();
}
}
}
Et j'ai essayé plus tard un Commons HttpClient 4.0.1 mais toujours la même erreur:
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
Légende
la source
la source
Réponses:
Avez-vous essayé ceci (en utilisant HttpClient version 4):
la source
java.util.Base64
partir de Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Ok donc celui-ci fonctionne. Juste au cas où quelqu'un le voudrait, voici la version qui fonctionne pour moi :)
la source
Base64Encoder
. Jonas pouvez-vous s'il vous plaît donner le pot plein? Quel est également le nom complet de la classeBase64Encoder
?Base64Encoder
regarder ici . PourBase64
regarder dans commons-codec-1.6.jar dans 4.2.5.zip sur Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
C'est le code de la réponse acceptée ci-dessus, avec quelques modifications apportées concernant l'encodage Base64. Le code ci-dessous se compile.
la source
Une petite mise à jour - j'espère utile pour quelqu'un - cela fonctionne pour moi dans mon projet:
J'utilise la belle classe de domaine public Base64.java de Robert Harder (Merci Robert - Code disponible ici: Base64 - téléchargez-le et mettez-le dans votre paquet).
et faire un téléchargement d'un fichier (image, doc, etc.) avec authentification et écrire sur le disque local
Exemple:
la source
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
comme détaillé dans cette réponse sur cette pageVoici quelques points:
Vous pouvez envisager de passer à HttpClient 4 (de manière générale, si vous le pouvez, je ne pense pas que la version 3 soit toujours activement prise en charge).
Un code d'état 500 est une erreur de serveur, il peut donc être utile de voir ce que dit le serveur (un indice dans le corps de la réponse que vous imprimez?). Bien que cela puisse être causé par votre client, le serveur ne devrait pas échouer de cette façon (un code d'erreur 4xx serait plus approprié si la demande est incorrecte).
Je pense que
setDoAuthentication(true)
c'est la valeur par défaut (pas sûr). Ce qui pourrait être utile à essayer, c'est que l'authentification préemptive fonctionne mieux:Sinon, la principale différence entre
curl -d ""
et ce que vous faites en Java est que, en plus deContent-Length: 0
, curl envoie égalementContent-Type: application/x-www-form-urlencoded
. Notez qu'en termes de design, vous devriez probablement envoyer une entité avec votrePOST
demande de toute façon.la source
Merci pour toutes les réponses ci-dessus, mais pour moi, je ne trouve pas la classe Base64Encoder, donc je me débrouille quand même.
Encore une chose, j'ai aussi essayé
Cela ne fonctionne PAS car il renvoie une chaîne presque identique avec
mais finissez par "\ r \ n", alors le serveur retournera "mauvaise demande".
Le code suivant fonctionne également, en fait, je règle ce problème en premier, mais pour une raison quelconque, il ne fonctionne PAS dans certains environnements cloud (sae.sina.com.cn si vous voulez savoir, c'est un service cloud chinois). il faut donc utiliser l'en-tête http au lieu des informations d'identification HttpClient.
la source
lors de l'utilisation du tableau d'en-tête
la source
pour HttpClient, utilisez toujours HttpRequestInterceptor par exemple
la source
HttpBasicAuth fonctionne pour moi avec des modifications plus petites
J'utilise la dépendance maven
Petit changement
la source
Un moyen simple de se connecter avec un HTTP POST sans effectuer d'appels spécifiques à Base64 consiste à utiliser HTTPClient BasicCredentialsProvider
la source