HttpClient adalah perpustakaan implementasi komunikasi HTTP sisi klien. Tujuan HttpClient adalah mengirim dan menerima pesan HTTP.
Saya yakin saya tidak perlu mengatakan lebih banyak tentang pentingnya protokol Http. Dibandingkan dengan URLConnection yang disertakan dengan JDK tradisional, HttpClient telah meningkatkan kemudahan penggunaan dan fleksibilitas (kita akan membahas perbedaan spesifiknya di masa mendatang). bukan hanya cara bagi klien untuk mengirim permintaan Http. Mudah, dan juga memfasilitasi pengembang untuk menguji antarmuka (berdasarkan protokol HTTP), yang tidak hanya meningkatkan efisiensi pengembangan, tetapi juga memfasilitasi peningkatan dari pengembangan. ketahanan kode. Oleh karena itu, penguasaan HttpClient sangat penting dan wajib. Setelah menguasai HttpClient, saya yakin pemahaman tentang protokol Http akan semakin dalam.
1. Pendahuluan
HttpClient adalah sub-proyek di bawah Apache Jakarta Common, yang digunakan untuk menyediakan perangkat pemrograman klien yang efisien, terkini, kaya fitur yang mendukung protokol HTTP, dan mendukung versi terbaru serta rekomendasi protokol HTTP. HttpClient telah digunakan di banyak proyek. Misalnya, dua proyek open source terkenal lainnya di Apache Jakarta, Cactus dan HTMLUnit, keduanya menggunakan HttpClient.
Alamat pengunduhan: http://hc.apache.org/downloads.cgi
2. Karakteristik
1. Berdasarkan bahasa java standar dan murni. Menerapkan Http1.0 dan Http1.1
2. Mengimplementasikan semua metode Http (GET, POST, PUT, DELETE, HEAD, OPTIONS, dan TRACE) dengan struktur berorientasi objek yang dapat diperluas.
3. Mendukung protokol HTTPS.
4. Buat koneksi transparan melalui proxy HTTP.
5. Gunakan metode CONNECT untuk membuat koneksi https yang disalurkan melalui proxy Http.
6. Sesi Dasar, Intisari, NTLMv1, NTLMv2, NTLM2, skema otentikasi SNPNEGO/Kerberos.
7. Skema otentikasi khusus plug-in.
8. Pabrik soket yang portabel dan andal memudahkan penggunaan solusi pihak ketiga.
9. Manajer koneksi mendukung aplikasi multi-thread. Mendukung pengaturan jumlah maksimum koneksi, serta pengaturan jumlah maksimum koneksi untuk setiap host, dan menemukan dan menutup koneksi yang kedaluwarsa.
10. Secara otomatis menangani cookie di Set-Cookie.
11. Kebijakan cookie khusus plug-in.
12. Aliran keluaran Permintaan dapat menghindari buffering konten dalam aliran langsung ke server soket.
13. Aliran input Respons dapat secara efektif membaca konten terkait langsung dari server soket.
14. Gunakan KeepAlive untuk memelihara koneksi persisten di http1.0 dan http1.1.
15. Dapatkan langsung kode respon dan header yang dikirim oleh server.
16. Kemampuan untuk mengatur batas waktu koneksi.
17. Dukungan eksperimental untuk cache respons http1.1.
18. Kode sumber tersedia secara bebas di bawah Lisensi Apache.
3. Cara menggunakan
Sangat mudah menggunakan HttpClient untuk mengirim permintaan dan menerima tanggapan. Umumnya, langkah-langkah berikut diperlukan.
1. Buat objek HttpClient.
2. Buat instance metode permintaan dan tentukan URL permintaan. Jika Anda perlu mengirim permintaan GET, buatlah objek HttpGet; jika Anda perlu mengirim permintaan POST, buatlah objek HttpPost.
3. Jika Anda perlu mengirim parameter permintaan, Anda dapat memanggil metode setParams (HetpParams params) yang umum pada HttpGet dan HttpPost untuk menambahkan parameter permintaan; untuk objek HttpPost, Anda juga dapat memanggil metode setEntity (entitas HttpEntity) untuk mengatur permintaan parameter.
4. Panggil eksekusi (permintaan HttpUriRequest) dari objek HttpClient untuk mengirim permintaan.
5. Panggil getAllHeaders() HttpResponse, getHeaders(String name) dan metode lain untuk mendapatkan header respons server; panggil metode getEntity() HttpResponse untuk mendapatkan objek HttpEntity, yang menggabungkan konten respons server. Program dapat memperoleh konten respons server melalui objek ini.
6. Lepaskan koneksinya. Terlepas dari berhasil atau tidaknya metode eksekusi, koneksi harus dilepaskan
4. Contoh
paket com.test; impor java.io.File; impor java.io.FileInputStream; impor java.io.IOException; impor java.io.UnsupportedEncodingException; keamanan.KeyStoreException; impor java.keamanan.NoSuchAlgorithmException; java.security.cert.CertificateException; impor java.util.ArrayList; impor java.util.List; impor javax.net.ssl.SSLContext; org.apache.http.ParseException; impor org.apache.http.client.ClientProtocolException impor; org.apache.http.client.entity.UrlEncodedFormEntity; impor org.apache.http.client.methods.CloseableHttpResponse; impor org.apache.http.client.methods.HttpGet; ;impor org.apache.http.conn.ssl.SSLConnectionSocketFactory; impor org.apache.http.conn.ssl.SSLContexts; impor org.apache.http.conn.ssl.TrustSelfSignedStrategy; org.apache.http.entity.mime.MultipartEntityBuilder; org.apache.http.entity.mime.content.FileBody; impor org.apache.http.entity.mime.content.StringBody; impor org.apache.http.impl.client.CloseableHttpClient; .client.HttpClients; impor org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; kelas publik HttpClientTest { @Test public void jUnitTest() { get() } /** * HttpClient terhubung ke SSL */ public void ssl() { CloseableHttpClient httpclient = null; coba { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = FileInputStream baru(File baru("d://Tomcat.keystore")); , "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace(); akhirnya { coba { instream.close(); } catch (Pengecualian abaikan) { } } // Percayai CA Anda sendiri dan semua sertifikat yang ditandatangani sendiri SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // Hanya izinkan penggunaan protokol TLSv1 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // Buat permintaan http (mode dapatkan) HttpGet httpget = baru HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("mengeksekusi permintaan" + httpget.getRequestLine()); CloseableHttpResponse respon = httpclient.execute(httpget); { Entitas HttpEntity = respon.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entitas != null) { System.out.println("Panjang konten respons: " + entitas.getContentLength()); (entitas)); EntityUtils.consume(entitas); (ParseException e) { e.printStackTrace(); } tangkapan (IOException e) { e.printStackTrace(); } tangkapan (KeyManagementException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } akhirnya { jika (httpclient != null) { coba { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Kirim formulir dalam mode posting (simulasikan permintaan login pengguna) */ public void postForm() { // Buat instance httpClient default. CloseableHttpClient httpclient = HttpClients.createDefault(); // Buat httppost HttpPost httppost = baru HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Membuat Daftar antrian parameter<namevaluepair> formparams = new ArrayList<namevaluepair>(); , "admin")); formparams.add(BasisNameValuePair baru("kata sandi", "123456")); UrlEncodedFormEntity uefEntity; coba { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); (httppost); coba { HttpEntity entitas = respon.getEntity(); if (entitas != null) { System.out.println("-------------------------- ------------"); System.out.println("Isi respons: " + EntityUtils.toString(entitas, "UTF-8")); System.out.println("-- ------------------------------------"); } } akhirnya { respon.close(); } } menangkap (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); catch (IOException e) { e.printStackTrace(); httpklien .close(); } tangkapan (IOException e) { e.printStackTrace(); Kirim permintaan posting untuk mengakses aplikasi lokal dan mengembalikan hasil yang berbeda sesuai dengan parameter berbeda yang diteruskan */ public void post() { // Buat instance httpClient default. CloseableHttpClient httpclient = HttpClients.createDefault(); // Buat instance httpClient default = HttpPost baru("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // Buat antrian parameter Daftar<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); "); httppost.setEntity(uefEntity); System.out.println("mengeksekusi permintaan " + httppost.getURI()); CloseableHttpResponse respon = httpclient.execute(httppost); coba { HttpEntity entitas = respon.getEntity(); .println("---------------------------"); .out.println ("Isi respons: " + EntityUtils.toString(entitas, "UTF-8")); System.out.println("----------------------------- ---------"); } } akhirnya { respon.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } menangkap (IOException e) { e.printStackTrace(); } akhirnya { // Tutup koneksi dan lepaskan sumber daya coba { httpclient.close(); } catch (IOException e) { e.printStackTrace(); / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); coba { // Buat httpget HttpGet("http://www.baidu.com/"); System.out.println("mengeksekusi permintaan " + httpget.getURI()); // Jalankan permintaan get. CloseableHttpResponse respon = httpclient.execute(httpget); coba { // Dapatkan entitas respons HttpEntity entitas = respon.getEntity(); System.out.println("----------------------------------------- ----------"); // Cetak status respons System.out.println(response.getStatusLine()); if (entity != null) {/ // Cetak panjang konten respons System.out.println("Panjang konten respons: " + entitas.getContentLength()); //Cetak konten respons System.out.println("Konten respons: " + EntityUtils.toString(entity) } System.out.println("----------------------------------------"); } akhirnya { respons .close(); } } tangkapan (ClientProtocolException e) { e.printStackTrace(); } tangkapan (ParseException e) { e.printStackTrace() } tangkapan (IOException e) { e.printStackTrace(); akhirnya { // Tutup koneksi dan lepaskan sumber daya coba { httpclient.close(); e) { e.printStackTrace(); 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = FileBody baru(baru File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("Semacam file biner", ContentType.TEXT_PLAIN); ", bin).addPart("komentar", komentar).build(); httppost.setEntity(reqEntity); System.out.println("mengeksekusi permintaan " + httppost.getRequestLine()); CloseableHttpResponse respon = httpclient.execute(httppost); coba { System.out.println("------------- -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = respons. getEntity( ); jika (resEntity != null) { System.out.println("Panjang konten respons: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); akhirnya { respon.close(); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); akhirnya { coba { httpclient.close(); } catch (IOException e) { e.printStackTrace();
Contoh ini menggunakan versi terbaru HttpClient4.3. Versi ini cukup berbeda dengan gaya penulisan kode sebelumnya, jadi harap lebih diperhatikan.
Oke, itulah keseluruhan isi artikel ini, semoga anda menyukainya.