Saya mencoba untuk meniru fungsionalitas dari perintah curl ini di Java:
curl --basic --user username:password -d "" http://ipaddress/test/login
Saya menulis yang berikut menggunakan Commons HttpClient 3.0 tetapi entah bagaimana akhirnya mendapatkan 500 Internal Server Error
dari server. Dapatkah seseorang memberi tahu saya jika saya melakukan sesuatu yang salah?
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();
}
}
}
Dan saya kemudian mencoba Commons HttpClient 4.0.1 tetapi masih kesalahan yang sama:
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
Legenda
sumber
sumber
Jawaban:
Sudahkah Anda mencoba ini (menggunakan HttpClient versi 4):
sumber
java.util.Base64
Java 8:Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Ok jadi yang ini berfungsi. Kalau-kalau ada yang menginginkannya, inilah versi yang bekerja untuk saya :)
sumber
Base64Encoder
. Jonas, bisakah kamu berikan kendi penuhnya? Juga apa nama kelas yang sepenuhnya memenuhi syaratBase64Encoder
?Base64Encoder
melihat di sini . UntukBase64
melihat di commons-codec-1.6.jar di 4.2.5.zip di Apache HttpComponents Downloads , doc ,import org.apache.commons.codec.binary.Base64;
String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
Ini adalah kode dari jawaban yang diterima di atas, dengan beberapa perubahan yang dilakukan terkait pengkodean Base64. Kode di bawah ini mengkompilasi.
sumber
Pembaruan kecil - semoga bermanfaat bagi seseorang - ini berfungsi untuk saya di proyek saya:
Saya menggunakan kelas Public Domain bagus Base64.java dari Robert Harder (Terima kasih Robert - Kode tersedia di sini: Base64 - unduh dan masukkan ke dalam paket Anda).
dan unduh file (gambar, dok, dll.) dengan autentikasi dan tulis ke disk lokal
Contoh:
sumber
The method encodeBytes(byte[]) is undefined for the type Base64
import org.apache.commons.codec.binary.Base64;
yang rinci dalam jawaban ini di halaman iniInilah beberapa poin:
Anda dapat mempertimbangkan untuk meningkatkan ke HttpClient 4 (secara umum, jika Anda bisa, saya rasa versi 3 masih tidak didukung secara aktif).
Kode status 500 adalah kesalahan server, jadi mungkin berguna untuk melihat apa yang dikatakan server (ada petunjuk di badan respons yang Anda cetak?). Meskipun mungkin disebabkan oleh klien Anda, server tidak boleh gagal dengan cara ini (kode kesalahan 4xx akan lebih sesuai jika permintaan salah).
Saya pikir
setDoAuthentication(true)
adalah default (tidak yakin). Apa yang bisa berguna untuk dicoba adalah otentikasi pre-emptive berfungsi lebih baik:Kalau tidak, perbedaan utama antara
curl -d ""
dan apa yang Anda lakukan di Jawa adalah bahwa, di sampingContent-Length: 0
, curl juga mengirimContent-Type: application/x-www-form-urlencoded
. Perhatikan bahwa dalam hal desain, Anda mungkin harus mengirim entitas denganPOST
permintaan Anda .sumber
Terima kasih atas semua jawaban di atas, tetapi untuk saya, saya tidak dapat menemukan kelas Base64Encoder, jadi saya tetap memilah jalan saya.
Satu hal lagi, saya juga mencoba
Ini TIDAK berfungsi karena mengembalikan string yang hampir sama dengan
tetapi diakhiri dengan "\ r \ n", maka server akan mengembalikan "permintaan buruk".
Kode berikut juga berfungsi, sebenarnya saya memilah ini terlebih dahulu, tetapi untuk beberapa alasan, ini TIDAK bekerja di beberapa lingkungan cloud (sae.sina.com.cn jika Anda ingin tahu, ini adalah layanan cloud Cina). jadi harus menggunakan header http bukan kredensial HttpClient.
sumber
saat menggunakan Header array
sumber
untuk HttpClient selalu gunakan HttpRequestInterceptor misalnya
sumber
HttpBasicAuth berfungsi untuk saya dengan perubahan yang lebih kecil
Saya menggunakan ketergantungan pakar
Perubahan kecil
sumber
Cara mudah untuk login dengan POST HTTP tanpa melakukan panggilan khusus Base64 adalah dengan menggunakan HTTPClient BasicCredentialsProvider
sumber