Я пытаюсь имитировать функциональность этой команды curl в Java:
curl --basic --user username:password -d "" http://ipaddress/test/login
Я написал следующее с помощью Commons HttpClient 3.0, но каким-то образом получал запрос 500 Internal Server Error
от сервера. Может кто-нибудь сказать мне, если я делаю что-то не так?
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();
}
}
}
И позже я попробовал Commons HttpClient 4.0.1, но все та же ошибка:
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
легенда
источник
источник
Ответы:
Вы пробовали это (используя версию 4 HttpClient):
источник
java.util.Base64
с Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Итак, этот работает. На всякий случай, если кто-то захочет, вот версия, которая работает для меня :)
источник
Base64Encoder
. Джонас, пожалуйста, дайте полную банку? И что такое полное имя классаBase64Encoder
?Base64Encoder
просмотра здесь . ДляBase64
просмотра в commons-codec-1.6.jar в 4.2.5.zip на Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
Это код из принятого ответа выше, с некоторыми изменениями, внесенными в кодировку Base64. Код ниже компилируется.
источник
Небольшое обновление - надеюсь, полезно для кого-то - оно работает для меня в моем проекте:
Я использую класс Public Public Base64.java от Роберта Хардера (Спасибо, Роберт - код доступен здесь: Base64 - скачайте и поместите его в свой пакет).
и загрузите файл (изображение, документ и т. д.) с аутентификацией и запишите на локальный диск
Пример:
источник
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
как подробно описано в этом ответе на этой страницеВот несколько моментов:
Вы могли бы рассмотреть возможность обновления до HttpClient 4 (вообще говоря, если вы можете, я не думаю, что версия 3 все еще активно поддерживается).
Код состояния 500 - это ошибка сервера, поэтому может быть полезно посмотреть, что говорит сервер (какая-либо подсказка в теле ответа, которое вы печатаете?). Хотя это может быть вызвано вашим клиентом, сервер не должен отказывать таким образом (код ошибки 4xx был бы более уместным, если запрос неверен).
Я думаю, что
setDoAuthentication(true)
это по умолчанию (не уверен). Что может быть полезно - превентивная аутентификация работает лучше:В противном случае основное отличие между
curl -d ""
тем, что вы делаете в Java, заключается в том, что, помимо этогоContent-Length: 0
, curl также отправляетContent-Type: application/x-www-form-urlencoded
. Обратите внимание, что с точки зрения дизайна, выPOST
все равно должны отправить объект с вашим запросом.источник
Спасибо за все ответы выше, но для меня, я не могу найти класс Base64Encoder, поэтому я все равно разбираюсь.
Еще одну вещь я тоже попробовал
Это НЕ работает из-за того, что возвращает строку почти так же с
но заканчивайте "\ r \ n", тогда сервер вернет "неверный запрос".
Также работает следующий код, на самом деле я сначала разбираюсь с этим, но по какой-то причине он НЕ работает в какой-то облачной среде (sae.sina.com.cn, если хотите знать, это китайский облачный сервис). поэтому необходимо использовать заголовок http вместо учетных данных HttpClient.
источник
при использовании массива заголовков
источник
для HttpClient всегда используйте HttpRequestInterceptor, например
источник
HttpBasicAuth у меня работает с небольшими изменениями
Я использую Maven зависимость
Меньшие изменения
источник
Простой способ для входа в систему с помощью HTTP POST , не делая каких - либо конкретных вызовов Base64 является использование HTTPClient BasicCredentialsProvider
источник