1 http
Protokol HTTP mungkin merupakan protokol yang paling banyak digunakan dan paling penting di internet sekarang. Semakin banyak aplikasi Java perlu secara langsung mengakses sumber daya jaringan melalui protokol HTTP.
Meskipun fungsi dasar mengakses protokol HTTP telah disediakan dalam paket JDK Java.net, perpustakaan JDK sendiri tidak memberikan yang tidak kaya dan fleksibel untuk sebagian besar aplikasi. HTTPClient digunakan untuk memberikan alat pemrograman klien yang efisien, terbaru, kaya fitur yang mendukung protokol HTTP, dan mendukung versi terbaru dan rekomendasi protokol HTTP.
Secara umum, kami menggunakan Chrome atau browser lain untuk mengakses server web, yang digunakan untuk menelusuri halaman untuk melihat informasi, mengirimkan beberapa data, mengunggah file, dll. Beberapa halaman yang dikunjungi hanyalah beberapa halaman biasa, beberapa mengharuskan pengguna masuk sebelum menggunakannya, atau memerlukan otentikasi dan beberapa dikirim melalui enkripsi, seperti HTTP. Browser yang saat ini kami gunakan untuk menangani situasi ini tidak akan menimbulkan masalah. Tetapi bagaimana jika kita memiliki kebutuhan untuk tidak mengakses sumber daya server melalui browser? Jadi apa yang harus saya lakukan?
Mari kita ambil klien lokal untuk mengunggah dan mengunduh file sebagai contoh untuk membuat demo kecil. Ada dua bentuk httpClient, satu di bawah org.apache.http dan yang lainnya adalah org.apache.commons.httpClient.httpClient.
2 unggahan file
Unggah file dapat diimplementasikan dalam dua cara, satu adalah metode postmethod dan yang lainnya adalah metode httppost. Keduanya serupa. PostMethod menggunakan filebody untuk membungkus aliran pembungkus file, dan httppost menggunakan FilePart untuk membungkus aliran file. Saat menyampaikan aliran file ke server, parameter lain dapat diteruskan pada saat yang sama.
2.1 Pemrosesan Klien
2.1.1 Metode PostMethod
Encapsulate file ke filepart dan masukkan ke dalam array bagian. Pada saat yang sama, parameter lain dapat ditempatkan ke stringpart. Tidak ada tulisan di sini, tetapi cukup atur parameter dalam bentuk setParameter. HttpClient di sini adalah org.apache.commons.httpclient.httpClient.
unggah public void (string localfile) {file file = file baru (localfile); Postmethod filepost = postmethod baru (url_str); Httpclient client = httpclient baru (); Coba {// metode berikut dapat digunakan untuk mensimulasikan parameter halaman pengiriman filepost.setParameter ("nama pengguna", nama pengguna); filepost.setParameter ("passwd", passwd); Bagian [] bagian = {filepart baru (file.getName (), file)}; filepost.setRequestEntity (multipartrequestity baru (bagian, filepost.getParams ())); client.getHttpConnectionManager (). getParams (). setConnectionTimeout (5000); status int = client.executeMethod (filePost); if (status == httpstatus.sc_ok) {System.out.println ("Diunggah dengan sukses"); } else {System.out.println ("Unggah gagal"); }} catch (exception ex) {ex.printstacktrace (); } akhirnya {filepost.releaseconnection (); }}Ingatlah untuk melepaskan koneksi melalui ReleasEconnection setelah menyelesaikannya.
2.1.2 Metode httppost
Metode ini mirip dengan yang di atas, tetapi menjadi filebody. Array bagian di atas sesuai dengan httpentity di sini. HTTPClient di sini berada di bawah org.apache.http.client.methods.
unggah public void (string localfile) {closeAdleHttpClient httpclient = null; CloseableHttpresponse response = null; coba {httpclient = httpclients.createdefault (); // unggah parameter dan file normal ke alamat berikut adalah servlet httppost httppost = httppost baru (url_str); // Konversikan file menjadi file aliran arebody bin = filebody baru (file baru (localfile)); Stringbody username = new stringbody ("scott", contentType.create ("text/polos", consts.utf_8)); Stringbody password = New StringBody ("123456", ContentType.Create ("Text/Plain", Consts.Utf_8)); Httpentity reqentity = multipartentitybuilder.create () // setara dengan <input type = "file" name = "file"/> .addpart ("file", bin) // setara dengan <input type = "name" name = "username" value = username> .addpart ("usern)" name "name," name, "Username = Username =. .membangun(); httppost.setentity (reqentity); // Mulailah permintaan dan kembalikan respons respons permintaan = httpclient.execute (httppost); System.out.println ("Nilai respons token:" + response.getFirStheader ("token"))); // Dapatkan objek respons httpentity dentity = response.getEntity (); if (resentity! = null) {// cetak panjang respons System.out.println ("Panjang konten respons:" + resentity.getContentLength ()); // cetak respons konten System.out.println (entityutils.tostring (resentity, charset.forname ("UTF-8")))); } // hancurkan entityutils.consume (kebencian); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {coba {if (response! = null) {response.close (); }} catch (ioException e) {E.PrintStackTrace (); } coba {if (httpclient! = null) {httpclient.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}2.2 Pemrosesan Sisi Server
Tidak peduli apa metode unggahan klien, pemrosesan di server adalah sama. Setelah mendapatkan parameter melalui HTTPServletRequest, item yang diperoleh diklasifikasikan ke dalam formulir biasa dan formulir file.
ServletFileUpload dapat mengatur format ukuran dan pengkodean dari file yang diunggah.
Singkatnya, pemrosesan sisi server memperlakukan parameter yang diperoleh sebagai bentuk HTML.
public void ProcessUpload (permintaan httpservletRequest, respons httpservletResponse) {file unggahfile = file baru (unggahPath); if (! unggahfile.exists ()) {unggahfile.mkdirs (); } System.out.println ("Ayo, sayang ......"); request.setcharacterencoding ("UTF-8"); response.setcharacterencoding ("UTF-8"); // deteksi apakah file unggahan ada boolean ismultipart = servletfileupload.ismultipartcontent (permintaan); if (isMultipart) {DiskFileItemFactory factory = new DiskFileItemFactory (); // Tentukan ukuran data yang di -cache dalam memori, unit ini byte, di sini diatur ke 1MB factory. // Atur data disimpan di direktori hard disk ketika ukuran file melebihi nilai getizeThreshold () factory.setrepository (file baru ("d: // temp")); // Buat file unggah file baru servletfileupload unggah = servletfileupload baru (pabrik); // Tentukan ukuran maksimum file tunggal yang diunggah, unit: byte, diatur ke unggah 50mb.setFileSizeMax (50 * 1024 * 1024); // Tentukan ukuran total beberapa file yang diunggah sekaligus, unit: byte, diatur ke unggah 50mb.setsizeMax (50 * 1024 * 1024); unggah.setheaderencoding ("UTF-8"); Daftar <FILEITEM> item = NULL; Coba {// Parse Request Request Items = unggah.ParSerequest (permintaan); } catch (FileuploAdException e) {E.PrintStackTrace (); } if (item! = null) {// parse item iterator <fileitem> iter = items.iterator (); while (iter.hasnext ()) {fileItem item = iter.next (); // Jika itu adalah atribut formulir normal if (item.isFormField ()) {// Atribut nama yang setara dengan input adalah <input type = "text" name = "content"> string name = item.getFieldName (); // atribut nilai input string value = item.getString (); System.out.println ("Properti:" + Name + "Nilai Atribut:" + Nilai); } // Jika mengunggah file lain {// atribut nama string fieldname = item.getFieldName (); // unggah path file string fileName = item.getName (); FileName = filename.substring (filename.LastIndexof ("/") + 1); // Dapatkan nama file file yang diunggah coba {item.write (file baru (unggahpath, fileName)); } catch (Exception e) {E.PrintStackTrace (); }}}}}} response.addheader ("token", "hello"); }Setelah diproses, server dapat menetapkan informasi sederhana yang dikembalikan ke klien di header. Jika klien yang kembali adalah aliran, ukuran aliran harus diatur terlebih dahulu!
response.setContentLength ((int) file.length ());
3 unduhan file
Unduhan file dapat diimplementasikan menggunakan getMethod of httpClient, dan metode httpget dan metode httpUrlConnection asli.
3.1 Pemrosesan Klien
3.1.1 Metode GetMethod
HttpClient di sini adalah org.apache.commons.httpclient.httpClient.
download public void (String remoteFileName, String localFileName) {httpClient client = new httpclient (); GetMethod get = null; FileOutputStream output = null; coba {get = new getMethod (url_str); get.setRequestheader ("nama pengguna", nama pengguna); get.setRequestheader ("Passwd", passwd); get.setRequestheader ("nama file", remotefileName); int i = client.executeMethod (get); if (Success == i) {System.out.println ("Nilai respons token:" + get.getResponseHeader ("token")); File StoreFile = File Baru (LocalFileName); output = FileOutputStream baru (StoreFile); // Dapatkan array byte sumber daya jaringan dan tulis ke file output.write (get.getResponseBody ()); } else {System.out.println ("Unduh File terjadi pengecualian, kode kesalahan adalah:" + i); }} catch (Exception e) {e.printstacktrace (); } akhirnya {coba {if (output! = null) {output.close (); }} catch (ioException e) {E.PrintStackTrace (); } get.releaseconnection (); client.getHttpConnectionManager (). CloseIdleconnections (0); }}3.1.2 Metode httpget
HTTPClient di sini berada di bawah org.apache.http.client.methods.
download public void (string remoteFileName, String localFileName) {defaulthttpClient httpclient = new DefaulThttpClient (); OutputStream out = null; Inputstream in = null; coba {httpget httpget = httpget baru (url_str); httpget.addheader ("nama pengguna", nama pengguna); httpget.addheader ("passwd", passwd); httpget.addheader ("nama file", remotefileName); Httpresponse httpresponse = httpclient.execute (httpget); Httpentity entitas = httpresponse.getEntity (); di = entity.getContent (); panjang panjang = entity.getContentLength (); if (length <= 0) {System.out.println ("File unduhan tidak ada!"); kembali; } System.out.println ("Nilai respons token:" + httpresponse.getFirStheader ("token"))); File file = file baru (LocalFileName); if (! file.exists ()) {file.createNewFile (); } out = FileOutputStream baru (file); byte [] buffer = byte baru [4096]; int readlength = 0; while ((readlength = in.read (buffer))> 0) {byte [] bytes = byte baru [readlength]; System.ArrayCopy (buffer, 0, byte, 0, readlength); out.write (bytes); } out.flush (); } catch (ioException e) {e.printstacktrace (); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {coba {if (in! = null) {in.close (); }} catch (ioException e) {E.PrintStackTrace (); } coba {if (out! = null) {out.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}3.1.3 Metode HTTPURLConnection
public void download3 (String RemoteFileName, String LocalFileName) {FileOutputStream out = null; Inputstream in = null; coba {url url = url baru (url_str); Urlconnection urlconnection = url.openconnection (); HttpurlConnection httpurlconnection = (httpurlconnection) urlconnection; // true - akan mengatur parameter httpurlconnection.setDoOutput (true); // true-akan mengizinkan dibaca dari httpurlconnection.setDoInput (true); // tidak akan menggunakan cache httpurlconnection.setusecaches (false); // mengatur serial httpurlconnection.setRequestProperty ("tipe konten", "aplikasi/x-java-serialized-object"); // default adalah mendapatkan httpurlconnection.setRequestMethod ("post"); httpurlConnection.setRequestProperty ("Connection", "Keep-Alive"); httpurlConnection.setRequestProperty ("Charsert", "UTF-8"); // 1 menit httpurlconnection.setConnecttimeout (60000); // 1 menit httpurlconnection.setreadtimeout (60000); httpurlconnection.addrequestproperty ("nama pengguna", nama pengguna); httpurlconnection.addrequestproperty ("passwd", passwd); httpurlconnection.addRequestProperty ("fileName", remoteFileName); // Sambungkan ke Server (TCP) httpurlConnection.connect (); di = httpurlConnection.getInputStream (); // kirim permintaan ke // file server file = file baru (localFileName); if (! file.exists ()) {file.createNewFile (); } out = FileOutputStream baru (file); byte [] buffer = byte baru [4096]; int readlength = 0; while ((readlength = in.read (buffer))> 0) {byte [] bytes = byte baru [readlength]; System.ArrayCopy (buffer, 0, byte, 0, readlength); out.write (bytes); } out.flush (); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {coba {if (in! = null) {in.close (); }} catch (ioException e) {E.PrintStackTrace (); } coba {if (out! = null) {out.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}3.2 Pemrosesan Sisi Server
Meskipun klien menangani secara berbeda, servernya sama.
public void ProcessDownload (permintaan httpservletRequest, respons httpservletResponse) {int buffer_size = 4096; Inputstream in = null; OutputStream out = null; System.out.println ("Ayo, sayang ......"); coba {request.setcharacterencoding ("UTF-8"); response.setcharacterencoding ("UTF-8"); response.setContentType ("Application/Octet-stream"); String username = request.getHeader ("nama pengguna"); String passwd = request.getHeader ("passwd"); String filename = request.getHeader ("fileName"); System.out.println ("Nama pengguna:" + nama pengguna); System.out.println ("Passwd:" + Passwd); System.out.println ("nama file:" + nama file); // Pemrosesan lebih lanjut dapat dilakukan berdasarkan nama pengguna dan passwd yang diteruskan, seperti memverifikasi apakah permintaannya legal, dll. File file = file baru (unduhPath + "//" + nama file); response.setContentLength ((int) file.length ()); response.setHeader ("receques", "bytes"); int readlength = 0; di = baru bufferedInputStream (FileInputStream baru (file), buffer_size); out = baru bufferedoutputStream (response.getoutputStream ()); byte [] buffer = byte baru [buffer_size]; while ((readlength = in.read (buffer))> 0) {byte [] bytes = byte baru [readlength]; System.ArrayCopy (buffer, 0, byte, 0, readlength); out.write (bytes); } out.flush (); response.addheader ("token", "halo 1"); } catch (Exception e) {E.PrintStackTrace (); response.addheader ("token", "Hello 2"); } akhirnya {if (in! = null) {coba {in.close (); } catch (ioException e) {}} if (out! = null) {coba {out.close (); } catch (ioException e) {}}}}4 Ringkasan
Fungsi httpClient yang paling dasar adalah menjalankan metode HTTP. Eksekusi metode HTTP melibatkan interaksi satu atau lebih permintaan HTTP/respons HTTP. Biasanya proses ini akan diproses secara otomatis oleh HTTPClient dan transparan untuk pengguna. Pengguna hanya perlu memberikan objek permintaan HTTP, dan HTTPClient akan mengirim permintaan HTTP ke server target dan menerima respons server. Jika permintaan HTTP tidak berhasil dieksekusi, HTTPPCLIEN akan melempar pengecualian. Jadi perhatikan akhirnya penanganan saat menulis kode.
Semua permintaan HTTP memiliki jalur permintaan, termasuk nama metode, URI permintaan dan nomor versi HTTP. HTTPClient mendukung semua metode HTTP yang didefinisikan dalam HTTP/1.1: Dapatkan, Kepala, Pos, Put, hapus, jejak dan opsi. Upload di atas menggunakan postingan, dan unduhan didapat.
Saat ini, gunakan org.apache.commons.httpclient.httpClient lebih. Terserah saya ~
Di atas adalah semua isi dari metode unggahan dan unduhan menggunakan httpClient untuk mengimplementasikan file. Saya harap semua orang dapat mendukung wulin.com lebih banyak ~