1 http
โปรโตคอล HTTP น่าจะเป็นโปรโตคอลที่ใช้มากที่สุดและสำคัญที่สุดบนอินเทอร์เน็ตในขณะนี้ แอปพลิเคชัน Java มากขึ้นเรื่อย ๆ จำเป็นต้องเข้าถึงทรัพยากรเครือข่ายโดยตรงผ่านโปรโตคอล HTTP
แม้ว่าฟังก์ชั่นพื้นฐานของการเข้าถึงโปรโตคอล HTTP นั้นได้รับการจัดเตรียมไว้ในแพ็คเกจ JDK Java.net แต่ห้องสมุด JDK นั้นมีความหลากหลายและยืดหยุ่นเพียงพอสำหรับแอปพลิเคชันส่วนใหญ่ HTTPClient ใช้เพื่อให้ชุดเครื่องมือการเขียนโปรแกรมไคลเอ็นต์ที่มีประสิทธิภาพล่าสุดและมีคุณสมบัติที่รองรับโปรโตคอล HTTP และรองรับเวอร์ชันล่าสุดและคำแนะนำของโปรโตคอล HTTP
โดยทั่วไปแล้วเราใช้ Chrome หรือเบราว์เซอร์อื่น ๆ เพื่อเข้าถึงเว็บเซิร์ฟเวอร์ซึ่งใช้ในการเรียกดูหน้าเพื่อดูข้อมูลส่งข้อมูลบางส่วนอัปโหลดไฟล์ ฯลฯ หน้าเว็บที่เข้าชมบางหน้าเป็นเพียงบางหน้าธรรมดาบางคนต้องการให้ผู้ใช้เข้าสู่ระบบก่อนที่จะใช้หรือต้องการการตรวจสอบ เบราว์เซอร์ที่เราใช้ในการจัดการสถานการณ์เหล่านี้จะไม่ก่อให้เกิดปัญหา แต่ถ้าเรามีความจำเป็นที่จะต้องไม่เข้าถึงทรัพยากรของเซิร์ฟเวอร์ผ่านเบราว์เซอร์ แล้วฉันควรทำอย่างไร?
ลองใช้ไคลเอนต์โลคัลเพื่ออัปโหลดและดาวน์โหลดไฟล์เป็นตัวอย่างเพื่อทำการสาธิตเล็ก ๆ HTTPClient มีสองรูปแบบหนึ่งอยู่ภายใต้ org.apache.http และอีกรูปแบบหนึ่งคือ org.apache.commons.httpclient.httpClient
2 ไฟล์อัปโหลด
การอัปโหลดไฟล์สามารถใช้งานได้สองวิธีอย่างใดอย่างหนึ่งคือวิธีการ postmethod และอีกวิธีหนึ่งคือวิธี HTTPPOST ทั้งสองมีความคล้ายคลึงกัน PostMethod ใช้ FileBody เพื่อห่อสตรีมการห่อไฟล์และ HTTPPOST ใช้ FilePart เพื่อห่อโฟลว์ไฟล์ เมื่อผ่านสตรีมไฟล์ไปยังเซิร์ฟเวอร์พารามิเตอร์อื่น ๆ สามารถส่งผ่านในเวลาเดียวกัน
2.1 การประมวลผลไคลเอนต์
2.1.1 วิธีการหลังวิธีการ
ห่อหุ้มไฟล์ลงใน filepart และใส่ลงในอาร์เรย์ชิ้นส่วน ในเวลาเดียวกันพารามิเตอร์อื่น ๆ สามารถวางลงใน StringPart ไม่มีการเขียนที่นี่ แต่เพียงแค่ตั้งค่าพารามิเตอร์ในรูปแบบของ setparameter httpClient ที่นี่คือ org.apache.commons.httpclient.httpclient
การอัปโหลดโมฆะสาธารณะ (สตริง localfile) {ไฟล์ไฟล์ = ไฟล์ใหม่ (localFile); postmethod filepost = postmethod ใหม่ (url_str); httpClient client = new httpClient (); ลอง {// วิธีการต่อไปนี้สามารถใช้เพื่อจำลองการส่งพารามิเตอร์หน้า filepost.setParameter ("ชื่อผู้ใช้" ชื่อผู้ใช้); filepost.setParameter ("passwd", passwd); ส่วน [] parts = {filepart ใหม่ (file.getName (), ไฟล์)}; filepost.setRequestEntity (MultipartRequestEntity ใหม่ (ชิ้นส่วน, filepost.getParams ())); client.getHttpConnectionManager (). getParams (). setConnectionTimeout (5000); สถานะ int = client.executemethod (filepost); if (สถานะ == httpstatus.sc_ok) {system.out.println ("อัปโหลดสำเร็จ"); } else {system.out.println ("อัปโหลดล้มเหลว"); }} catch (Exception ex) {ex.printstacktrace (); } ในที่สุด {filepost.releaseconnection (); -อย่าลืมปล่อยการเชื่อมต่อผ่านการเชื่อมต่อ releaseconnection หลังจากเสร็จสิ้น
2.1.2 วิธี httppost
วิธีนี้คล้ายกับข้างต้น แต่มันจะกลายเป็น filebody อาร์เรย์ชิ้นส่วนด้านบนสอดคล้องกับ httpentity ที่นี่ httpClient ที่นี่อยู่ภายใต้ org.apache.http.client.methods
การอัปโหลดโมฆะสาธารณะ (สตริง localfile) {closeablehttpClient httpClient = null; การตอบสนองแบบ closeablehtpresponse = null; ลอง {httpClient = httpClients.createdefault (); // อัปโหลดพารามิเตอร์ปกติและไฟล์ไปยังที่อยู่ต่อไปนี้คือ servlet httppost httppost = httppost ใหม่ (url_str); // แปลงไฟล์เป็น stream object filebody filebody bin = filebody ใหม่ (ไฟล์ใหม่ (localfile)); stringbody username = new Stringbody ("Scott", contentType.create ("ข้อความ/ธรรมดา", consts.utf_8)); StringBody Password = ใหม่ StringBody ("123456", contentType.create ("ข้อความ/ธรรมดา", consts.utf_8)); httpentity reqentity = multipartentityBuilder.create () // เทียบเท่ากับ <อินพุต type = "file" name = "ไฟล์"/> .addpart ("ไฟล์", bin) // เทียบเท่ากับ <อินพุต type = "text" name = "username" .สร้าง(); httppost.setEntity (reqentity); // เริ่มต้นคำขอและส่งคืนการตอบกลับของการตอบสนองคำขอ = httpClient.execute (httppost); System.out.println ("ค่าการตอบสนองของโทเค็น:" + response.getFirstheader ("โทเค็น")); // รับวัตถุตอบกลับ httpentity resentity = response.getEntity (); if (resentity! = null) {// พิมพ์ความยาวการตอบกลับ System.out.println ("ความยาวเนื้อหาตอบกลับ:" + resentity.getContentLength ()); // พิมพ์เนื้อหาการตอบกลับ System.out.println (entityutils.toString (ความไม่พอใจ, charset.forname ("UTF-8"))); } // ทำลาย entityutils.consume (ความไม่พอใจ); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (ตอบกลับ! = null) {response.close (); }} catch (ioexception e) {e.printstacktrace (); } ลอง {ถ้า (httpClient! = null) {httpClient.close (); }} catch (ioexception e) {e.printstacktrace (); -2.2 การประมวลผลฝั่งเซิร์ฟเวอร์
ไม่ว่าไคลเอนต์จะใช้วิธีการอัปโหลดแบบใดการประมวลผลบนเซิร์ฟเวอร์ก็เหมือนกัน หลังจากได้รับพารามิเตอร์ผ่าน httpservletrequest รายการที่ได้จะถูกจัดประเภทเป็นรูปแบบปกติและรูปแบบไฟล์
ServletFileUpload สามารถตั้งค่าขนาดและรูปแบบการเข้ารหัสของไฟล์ที่อัปโหลดได้
ในระยะสั้นการประมวลผลฝั่งเซิร์ฟเวอร์ถือว่าพารามิเตอร์ที่ได้รับเป็นรูปแบบ HTML
โมฆะสาธารณะ ProcessUpload (คำขอ httpservletRequest, การตอบกลับ httpservletResponse) {ไฟล์ uploadFile = ไฟล์ใหม่ (uploadPath); if (! uploadfile.exists ()) {uploadfile.mkdirs (); } system.out.println ("มาเลยที่รัก ...... "); request.Setcharacterencoding ("UTF-8"); Response.Setcharacterencoding ("UTF-8"); // การตรวจจับว่าไฟล์อัปโหลดมีอยู่ในบูลีน isMultipart = servletFileUpload.ismultipartContent (คำขอ); if (isMultipart) {diskfileitemfactory Factory = ใหม่ diskfileitemfactory (); // ระบุขนาดข้อมูลที่แคชในหน่วยความจำหน่วยคือไบต์ที่นี่ถูกตั้งค่าเป็น 1MB Factory.SetSizEthreshold (1024*1024); // ตั้งค่าข้อมูลจะถูกเก็บไว้ในไดเรกทอรีฮาร์ดดิสก์เมื่อขนาดไฟล์เกินค่าของ GetSizEthReshold () Factory.SetRepository (ไฟล์ใหม่ ("D: // TEMP")); // สร้างไฟล์อัพโหลดไฟล์ใหม่ ServletFilePilePileLoad อัปโหลด = ใหม่ servletFileUpload (โรงงาน); // ระบุขนาดสูงสุดของไฟล์ที่อัปโหลดเพียงไฟล์เดียวหน่วย: ไบต์ตั้งค่าเป็น 50MB upload.SetFilesizEmax (50 * 1024 * 1024); // ระบุขนาดทั้งหมดของไฟล์หลายไฟล์ที่อัปโหลดในครั้งเดียวหน่วย: ไบต์ตั้งค่าเป็น 50MB upload.SetSizeMax (50 * 1024 * 1024); Upload.Setheaderencoding ("UTF-8"); รายการ <fileItem> items = null; ลอง {// Parse Request Request items = upload.parserequest (คำขอ); } catch (fileuploadexception e) {e.printstacktrace (); } if (items! = null) {// parse form item iterator <fileitem> iter = items.iterator (); ในขณะที่ (iter.hasnext ()) {fileItem item = iter.next (); // ถ้าเป็นแอตทริบิวต์ฟอร์มปกติถ้า (item.isformfield ()) {// แอตทริบิวต์ชื่อเทียบเท่ากับอินพุตคือ <อินพุต type = "text" name = "content"> string name = item.getfieldName (); // แอตทริบิวต์ค่าของค่าสตริงอินพุต = item.getString (); System.out.println ("คุณสมบัติ:" + ชื่อ + "ค่าแอตทริบิวต์:" + ค่า); } // ถ้ามันกำลังอัปโหลดไฟล์อื่น {// แอตทริบิวต์ชื่อสตริง fieldName = item.getFieldName (); // อัปโหลดไฟล์สตริงพา ธ ไฟล์ชื่อ filename = item.getName (); filename = filename.substring (filename.lastindexof ("/") + 1); // รับชื่อไฟล์ของไฟล์ที่อัปโหลดลอง {item.write (ไฟล์ใหม่ (uploadpath, ชื่อไฟล์)); } catch (exception e) {e.printstacktrace (); }}}}}} response.addheader ("โทเค็น", "สวัสดี"); -หลังจากการประมวลผลเซิร์ฟเวอร์สามารถตั้งค่าข้อมูลง่าย ๆ ที่ส่งคืนไปยังไคลเอนต์ในส่วนหัว หากไคลเอนต์ Return เป็นสตรีมขนาดสตรีมจะต้องตั้งค่าล่วงหน้า!
Response.SetContentLength ((int) file.length ());
ดาวน์โหลดไฟล์ 3 ไฟล์
การดาวน์โหลดไฟล์สามารถนำไปใช้งานได้โดยใช้ getMethod ของ httpClient และวิธี httpget และวิธี HttpurlConnection ดั้งเดิม
3.1 การประมวลผลไคลเอนต์
3.1.1 วิธีการ getMethod
httpClient ที่นี่คือ org.apache.commons.httpclient.httpclient
ดาวน์โหลดโมฆะสาธารณะ (String RemoteFileName, String localFileName) {httpClient client = new httpClient (); getMethod get = null; fileOutputStream output = null; ลอง {get = ใหม่ getMethod (url_str); get.setRequestheader ("ชื่อผู้ใช้" ชื่อผู้ใช้); get.setRequestheader ("passwd", passwd); get.setRequestheader ("ชื่อไฟล์", RemoteFileName); int i = client.executemethod (รับ); if (success == i) {system.out.println ("ค่าการตอบกลับของโทเค็น:" + get.getResponseHeader ("โทเค็น")); file storeFile = ไฟล์ใหม่ (LocalFileName); output = new fileOutputStream (storeFile); // รับอาร์เรย์ไบต์ของทรัพยากรเครือข่ายและเขียนลงในไฟล์ output.write (get.getResponseBody ()); } else {system.out.println ("ไฟล์ดาวน์โหลดเกิดขึ้นข้อยกเว้นรหัสข้อผิดพลาดคือ:" + i); }} catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (เอาต์พุต! = null) {output.close (); }} catch (ioexception e) {e.printstacktrace (); } get.releaseconnection (); client.getHttpConnectionManager (). closidleConnections (0); -3.1.2 วิธีการ httpget
httpClient ที่นี่อยู่ภายใต้ org.apache.http.client.methods
ดาวน์โหลดโมฆะสาธารณะ (String RemoteFileName, String localFileName) {defaulthttpClient httpClient = ใหม่ defaulthttpClient (); outputstream out = null; inputStream ใน = null; ลอง {httpget httpget = new httpget (url_str); httpget.addheader ("ชื่อผู้ใช้" ชื่อผู้ใช้); httpget.addheader ("passwd", passwd); httpget.addheader ("ชื่อไฟล์", remotefilename); httpresponse httpresponse = httpClient.execute (httpget); HTTPENTITY เอนทิตี = httPresponse.getEntity (); ใน = entity.getContent (); ความยาวยาว = entity.getContentLength (); if (ความยาว <= 0) {system.out.println ("ไฟล์ดาวน์โหลดไม่มีอยู่!"); กลับ; } system.out.println ("ค่าการตอบสนองของโทเค็น:" + httpresponse.getfirstheader ("โทเค็น")); ไฟล์ไฟล์ = ไฟล์ใหม่ (LocalFileName); if (! file.exists ()) {file.createnewFile (); } out = ใหม่ fileOutputStream (ไฟล์); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [4096]; int readLength = 0; ในขณะที่ ((readLength = in.read (บัฟเฟอร์))> 0) {byte [] bytes = byte ใหม่ [readLength]; System.arrayCopy (บัฟเฟอร์, 0, ไบต์, 0, readLength); out.write (ไบต์); } out.flush (); } catch (ioexception e) {e.printstacktrace (); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (ใน! = null) {in.close (); }} catch (ioexception e) {e.printstacktrace (); } ลอง {ถ้า (ออก! = null) {out.close (); }} catch (ioexception e) {e.printstacktrace (); -3.1.3 วิธีการ httpurlconnection
โมฆะสาธารณะดาวน์โหลด 3 (String RemoteFileName, String localFileName) {fileOutputStream out = null; inputStream ใน = null; ลอง {url url = url ใหม่ (url_str); urlConnection urlConnection = url.openconnection (); httpurlConnection httpurlConnection = (httpurlConnection) urlconnection; // true - จะตั้งค่าพารามิเตอร์ httpurlconnection.setDooutput (จริง); // true-will อนุญาตให้อ่านจาก httpurlconnection.setDoInput (จริง); // จะไม่ใช้แคช httpurlconnection.setusecaches (เท็จ); // การตั้งค่า httpurlconnection.setRequestProperty ("ประเภทเนื้อหา", "แอปพลิเคชัน/x-java-serialized-object"); // ค่าเริ่มต้นคือ httpurlconnection.setRequestMethod ("โพสต์"); httpurlconnection.setRequestProperty ("การเชื่อมต่อ", "Keep-Alive"); httpurlconnection.setRequestProperty ("Charsert", "UTF-8"); // 1 นาที httpurlconnection.setConnectTimeout (60000); // 1 นาที httpurlconnection.setReadtimeout (60000); httpurlconnection.addrequestproperty ("ชื่อผู้ใช้", ชื่อผู้ใช้); httpurlconnection.addrequestproperty ("passwd", passwd); httpurlconnection.addrequestproperty ("ชื่อไฟล์", Remotefilename); // เชื่อมต่อกับเซิร์ฟเวอร์ (TCP) httpurlconnection.connect (); ใน = httpurlConnection.getInputStream (); // ส่งคำขอไปยัง // ไฟล์เซิร์ฟเวอร์ไฟล์ = ไฟล์ใหม่ (localFileName); if (! file.exists ()) {file.createnewFile (); } out = ใหม่ fileOutputStream (ไฟล์); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [4096]; int readLength = 0; ในขณะที่ ((readLength = in.read (บัฟเฟอร์))> 0) {byte [] bytes = byte ใหม่ [readLength]; System.arrayCopy (บัฟเฟอร์, 0, ไบต์, 0, readLength); out.write (ไบต์); } out.flush (); } catch (exception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (ใน! = null) {in.close (); }} catch (ioexception e) {e.printstacktrace (); } ลอง {ถ้า (ออก! = null) {out.close (); }} catch (ioexception e) {e.printstacktrace (); -3.2 การประมวลผลฝั่งเซิร์ฟเวอร์
แม้ว่าไคลเอนต์จะจัดการแตกต่างกัน แต่เซิร์ฟเวอร์ก็เหมือนกัน
โมฆะสาธารณะ ProcessDownload (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) {int buffer_size = 4096; inputStream ใน = null; outputstream out = null; System.out.println ("มาเลยที่รัก ...... "); ลอง {request.setcharacterencoding ("UTF-8"); Response.Setcharacterencoding ("UTF-8"); Response.SetContentType ("แอปพลิเคชัน/octet-stream"); String username = request.getheader ("ชื่อผู้ใช้"); สตริง passwd = request.getheader ("passwd"); string filename = request.getheader ("ชื่อไฟล์"); System.out.println ("ชื่อผู้ใช้:" + ชื่อผู้ใช้); System.out.println ("passwd:" + passwd); System.out.println ("ชื่อไฟล์:" + ชื่อไฟล์); // การประมวลผลเพิ่มเติมสามารถดำเนินการตามชื่อผู้ใช้ที่ผ่านและ passwd เช่นการตรวจสอบว่าคำขอนั้นถูกกฎหมาย ฯลฯ ไฟล์ไฟล์ = ไฟล์ใหม่ (downloadpath + "//" + ชื่อไฟล์); Response.SetContentLength ((int) file.length ()); Response.Setheader ("ยอมรับช่วง", "Bytes"); int readLength = 0; ใน = ใหม่ bufferedInputStream (ใหม่ fileInputStream (ไฟล์), buffer_size); out = ใหม่ bufferedOutputStream (response.getOutputStream ()); Byte [] buffer = byte ใหม่ [buffer_size]; ในขณะที่ ((readLength = in.read (บัฟเฟอร์))> 0) {byte [] bytes = byte ใหม่ [readLength]; System.arrayCopy (บัฟเฟอร์, 0, ไบต์, 0, readLength); out.write (ไบต์); } out.flush (); Response.addheader ("โทเค็น", "สวัสดี 1"); } catch (exception e) {e.printstacktrace (); Response.addheader ("โทเค็น", "สวัสดี 2"); } ในที่สุด {ถ้า (ใน! = null) {ลอง {in.close (); } catch (ioexception e) {}} ถ้า (out! = null) {ลอง {out.close (); } catch (ioexception e) {}}}}4 สรุป
ฟังก์ชั่นพื้นฐานที่สุดของ HTTPClient คือการดำเนินการวิธี HTTP การดำเนินการของวิธี HTTP เกี่ยวข้องกับการโต้ตอบของการร้องขอ HTTP หนึ่งครั้งหรือมากกว่านั้น/การตอบกลับ HTTP โดยปกติกระบวนการนี้จะถูกประมวลผลโดยอัตโนมัติโดย HTTPClient และโปร่งใสให้กับผู้ใช้ ผู้ใช้ต้องการเพียงจัดเตรียมวัตถุคำขอ HTTP และ HTTPClient จะส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์เป้าหมายและรับการตอบกลับของเซิร์ฟเวอร์ หากคำขอ HTTP ไม่ได้ดำเนินการสำเร็จ HTTPPClient จะทำการยกเว้น ดังนั้นให้ความสนใจกับการจัดการในที่สุดเมื่อเขียนรหัส
คำขอ HTTP ทั้งหมดมีบรรทัดคำขอรวมถึงชื่อวิธีการคำขอ URI และหมายเลขเวอร์ชัน HTTP HTTPClient รองรับวิธี HTTP ทั้งหมดที่กำหนดไว้ใน HTTP/1.1: รับ, หัว, โพสต์, ใส่, ลบ, ติดตามและตัวเลือก การอัพโหลดด้านบนใช้โพสต์และการดาวน์โหลดจะได้รับ
ปัจจุบันใช้ org.apache.commons.httpclient.httpClient เพิ่มเติม มันขึ้นอยู่กับฉัน ~
ข้างต้นเป็นเนื้อหาทั้งหมดของวิธีการอัปโหลดและดาวน์โหลดของการใช้ HTTPClient เพื่อใช้ไฟล์ ฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น ~