Estou tentando imitar a funcionalidade deste comando curl em Java:
curl --basic --user username:password -d "" http://ipaddress/test/login
Eu escrevi o seguinte usando o Commons HttpClient 3.0, mas de alguma forma acabei recebendo um 500 Internal Server Error
do servidor. Alguém pode me dizer se estou fazendo algo errado?
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();
}
}
}
Mais tarde, tentei um Commons HttpClient 4.0.1, mas ainda assim o mesmo erro:
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
lenda
fonte
fonte
Respostas:
Você já tentou isso (usando o HttpClient versão 4):
fonte
java.util.Base64
partir do Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Ok, então este funciona. Caso alguém queira, aqui está a versão que funciona para mim :)
fonte
Base64Encoder
. Jonas, você pode dar o pote cheio? Também qual é o nome completo da classeBase64Encoder
?Base64Encoder
olhar aqui . ParaBase64
procurar no commons-codec-1.6.jar no 4.2.5.zip no Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
Este é o código da resposta aceita acima, com algumas alterações feitas em relação à codificação Base64. O código abaixo é compilado.
fonte
Uma pequena atualização - espero que útil para alguém - funciona para mim no meu projeto:
Eu uso a boa classe Base64.java do Domínio Público de Robert Harder (Obrigado Robert - Código disponível aqui: Base64 - faça o download e coloque-o no seu pacote).
e faça o download de um arquivo (imagem, documento, etc.) com autenticação e grave no disco local
Exemplo:
fonte
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
como detalhado neste resposta sobre esta páginaAqui estão alguns pontos:
Você pode considerar a atualização para o HttpClient 4 (em geral, se puder, acho que a versão 3 ainda não é ativamente suportada).
Um código de status 500 é um erro do servidor; portanto, pode ser útil ver o que o servidor diz (alguma pista no corpo da resposta que você está imprimindo?). Embora possa ser causado pelo seu cliente, o servidor não deve falhar dessa maneira (um código de erro 4xx seria mais apropriado se a solicitação estiver incorreta).
Eu acho que
setDoAuthentication(true)
é o padrão (não tenho certeza). O que poderia ser útil tentar é a autenticação preventiva funcionar melhor:Caso contrário, a principal diferença entre
curl -d ""
e o que você está fazendo em Java é que, além deContent-Length: 0
, o curl também enviaContent-Type: application/x-www-form-urlencoded
. Observe que, em termos de design, você provavelmente deve enviar uma entidade com suaPOST
solicitação de qualquer maneira.fonte
Obrigado por todas as respostas acima, mas, para mim, não consigo encontrar a classe Base64Encoder, então resolvo o meu caminho de qualquer maneira.
Mais uma coisa, eu também tentei
NÃO funciona devido a retornar uma string quase igual a
mas termine com "\ r \ n", o servidor retornará "solicitação incorreta".
Também o código a seguir também está funcionando, na verdade eu resolvo isso primeiro, mas, por algum motivo, NÃO funciona em algum ambiente de nuvem (sae.sina.com.cn, se você quiser saber, é um serviço de nuvem chinês). então, use o cabeçalho http em vez das credenciais HttpClient.
fonte
enquanto estiver usando matriz de cabeçalho
fonte
para HttpClient sempre use HttpRequestInterceptor, por exemplo
fonte
HttpBasicAuth funciona para mim com alterações menores
Eu uso dependência maven
Mudança menor
fonte
Uma maneira fácil de fazer login com um HTTP POST sem fazer chamadas específicas à Base64 é usar o HTTPClient BasicCredentialsProvider
fonte