Estoy tratando de imitar la funcionalidad de este comando curl en Java:
curl --basic --user username:password -d "" http://ipaddress/test/login
Escribí lo siguiente usando Commons HttpClient 3.0 pero de alguna manera terminé recibiendo un 500 Internal Server Error
mensaje del servidor. ¿Alguien puede decirme si estoy haciendo algo 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();
}
}
}
Y luego probé un HttpClient 4.0.1 de Commons pero aún el mismo error:
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
Leyenda
fuente
fuente
Respuestas:
¿Has probado esto (usando HttpClient versión 4):
fuente
java.util.Base64
partir de Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Ok, entonces este funciona. Por si alguien lo quiere, aquí está la versión que funciona para mí :)
fuente
Base64Encoder
. Jonas, ¿puedes dar el frasco completo? ¿Cuál es el nombre completo de la clase deBase64Encoder
?Base64Encoder
ver aquí . ParaBase64
buscar en commons-codec-1.6.jar en 4.2.5.zip en Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
Este es el código de la respuesta aceptada anteriormente, con algunos cambios realizados con respecto a la codificación Base64. El siguiente código se compila.
fuente
Una pequeña actualización, con suerte útil para alguien, funciona para mí en mi proyecto:
Uso la buena clase de dominio público Base64.java de Robert Harder (Gracias Robert - Código disponible aquí: Base64 - descárgalo y ponlo en tu paquete).
y descargue un archivo (imagen, documento, etc.) con autenticación y escriba en el disco local
Ejemplo:
fuente
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
como se detalla en esta respuesta en esta páginaAquí hay algunos puntos:
Podría considerar actualizar a HttpClient 4 (en términos generales, si puede, no creo que la versión 3 siga siendo compatible).
Un código de estado 500 es un error del servidor, por lo que puede ser útil ver lo que dice el servidor (¿alguna pista en el cuerpo de respuesta que está imprimiendo?). Aunque puede ser causado por su cliente, el servidor no debería fallar de esta manera (un código de error 4xx sería más apropiado si la solicitud es incorrecta).
Creo que
setDoAuthentication(true)
es el valor predeterminado (no estoy seguro). Lo que podría ser útil para probar es que la autenticación preventiva funciona mejor:De lo contrario, la principal diferencia entre
curl -d ""
y lo que está haciendo en Java es que, además deContent-Length: 0
, curl también envíaContent-Type: application/x-www-form-urlencoded
. Tenga en cuenta que, en términos de diseño, probablemente debería enviar una entidad con suPOST
solicitud de todos modos.fuente
Gracias por todas las respuestas anteriores, pero para mí, no puedo encontrar la clase Base64Encoder, así que lo soluciono de todos modos.
Una cosa más, también intenté
NO funciona debido a que devuelve una cadena casi igual con
pero termina con "\ r \ n", entonces el servidor devolverá "solicitud incorrecta".
Además, el siguiente código también funciona, en realidad lo soluciono primero, pero por alguna razón, NO funciona en algún entorno de nube (sae.sina.com.cn si quieres saberlo, es un servicio de nube chino). así que tengo que usar el encabezado http en lugar de las credenciales HttpClient.
fuente
mientras usa la matriz de encabezado
fuente
para HttpClient siempre use HttpRequestInterceptor por ejemplo
fuente
HttpBasicAuth funciona para mí con pequeños cambios
Yo uso dependencia maven
Cambio más pequeño
fuente
Una manera fácil de iniciar sesión con un HTTP POST sin hacer ninguna llamada específica de Base64 es usar HTTPClient BasicCredentialsProvider
fuente