1 http
من المحتمل أن يكون بروتوكول HTTP هو البروتوكول الأكثر استخدامًا والأكثر أهمية على الإنترنت الآن. تحتاج المزيد والمزيد من تطبيقات Java إلى الوصول مباشرة إلى موارد الشبكة من خلال بروتوكول HTTP.
على الرغم من أن الوظيفة الأساسية للوصول إلى بروتوكول HTTP قد تم توفيرها في حزمة JDK Java.net ، فإن مكتبة JDK نفسها لا توفر غير غنية ومرنة بما يكفي لمعظم التطبيقات. يتم استخدام HTTPCLIENT لتوفير مجموعات أدوات برمجة عميل فعالة وأحدث وأحدث للميزات التي تدعم بروتوكول HTTP ، ويدعم أحدث الإصدارات وتوصيات بروتوكول HTTP.
بشكل عام ، نستخدم Chrome أو المتصفحات الأخرى للوصول إلى خادم الويب ، والذي يتم استخدامه لتصفح الصفحات لعرض المعلومات ، أو إرسال بعض البيانات ، أو ملفات التحميل ، وما إلى ذلك. بعض الصفحات التي تمت زيارتها هي مجرد بعض الصفحات العادية ، والبعض الآخر يتطلب من المستخدمين تسجيل الدخول قبل استخدامها ، أو يتطلب المصادقة ، ويتم نقل بعضها من خلال التشفير ، مثل HTTPS. المتصفحات التي نستخدمها حاليًا للتعامل مع هذه المواقف لن تشكل مشكلة. ولكن ماذا لو كان لدينا حاجة إلى عدم الوصول إلى موارد الخادم من خلال المتصفح؟ إذن ماذا علي أن أفعل؟
دعنا نأخذ العميل المحلي لتحميل الملفات وتنزيلها كمثال لصنع عرض تجريبي صغير. هناك نوعان من httpclient ، واحد تحت org.apache.http والآخر هو org.apache.commons.httpclient.httpclient.
2 تحميل الملف
يمكن تنفيذ تحميل الملف بطريقتين ، أحدهما طريقة postmethod والآخر هو طريقة HTTPPOST. الاثنان متشابهان. يستخدم PostMethod filebody لف لف تدفق ملف الملف ، ويستخدم HTTPPOST FilePart لالتفاف تدفق الملف. عند تمرير تدفقات الملفات إلى الخادم ، يمكن تمرير المعلمات الأخرى في نفس الوقت.
2.1 معالجة العميل
2.1.1 طريقة postmethod
قم بتغليف الملف في FilePart ووضعه في مجموعة جزء. في الوقت نفسه ، يمكن وضع معلمات أخرى في StringPart. لا توجد كتابة هنا ، ولكن ببساطة قم بتعيين المعلمات في شكل setParameter. httpclient هنا هو org.apache.commons.httpclient.httpclient.
تحميل باطل عام (String localFile) {file file = file new (localFile) ؛ postmethod filepost = جديد postmethod (url_str) ؛ httpclient client = new httpclient () ؛ جرب {// يمكن استخدام الطرق التالية لمحاكاة معلمة الصفحة filePost.setParameter ("اسم المستخدم" ، اسم المستخدم) ؛ filepost.setParameter ("passwd" ، passwd) ؛ part [] parts = {new filePart (file.getName () ، file)} ؛ filepost.setRequestentity (multiredrequestentity جديد (أجزاء ، filepost.getParams ())) ؛ client.gethttpconnectionManager (). getParams (). setConnectionTimeout (5000) ؛ int status = client.executemethod (filepost) ؛ if (status == httpstatus.sc_ok) {system.out.println ("تم تحميله بنجاح") ؛ } آخر {system.out.println ("التحميل فشل") ؛ }} catch (استثناء ex) {ex.printStackTrace () ؛ } أخيرًا {filePost.ReleasEconnection () ؛ }}تذكر أن تصدر الاتصال من خلال RebeAseconnection بعد الانتهاء منه.
2.1.2 طريقة httppost
هذه الطريقة مشابهة لما ورد أعلاه ، لكنه يصبح ملف filebody. صفيف الجزء أعلاه يتوافق مع httpentity هنا. httpclient هنا تحت org.apache.http.client.methods.
تحميل باطل عام (String localFile) {closleablehttpclient httpclient = null ؛ closablehttpresponse استجابة = فارغة ؛ حاول {httpclient = httpclients.createdefault () ؛ . // قم بتحويل الملف إلى ملف filebody bin bin = new filebody (ملف جديد (localfile)) ؛ stringbody username = new StringBody ("Scott" ، contentType.Create ("text/plain" ، consts.utf_8)) ؛ stringbody password = new StringBody ("123456" ، contentType.Create ("text/plain" ، consts.utf_8)) ؛ httpentity reqentity = multipartentitybuilder.create () // مكافئة لـ <input type = "file" name = "file"/> .addpart ("file" ، bin) // يعادل <type type = "text" name = "username" value = username. httppost.setentity (reqentity) ؛ // بدء الطلب وإرجاع استجابة طلب الطلب = httpclient.execute (httppost) ؛ System.out.println ("قيمة استجابة الرمز المميز:" + response.getFirStheader ("Token")) ؛ // الحصول على كائن الاستجابة httpentity resentity = response.getentity () ؛ if (resentity! = null) {// print endrate enduge system.out.println ("طول محتوى الاستجابة:" + resentity.getContentLength ()) ؛ // print response content system.out.println (entityUtils.ToString (resentity ، charset.forname ("utf-8"))) ؛ } // تدمير entityUtils.Consume (الاستياء) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (response! = null) {response.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } حاول {if (httpclient! = null) {httpclient.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}2.2 معالجة جانب الخادم
بغض النظر عن طريقة تحميل العميل ، فإن المعالجة على الخادم هي نفسها. بعد الحصول على المعلمات من خلال httpservletrequest ، يتم تصنيف العنصر الذي تم الحصول عليه إلى نماذج عادية ونماذج الملفات.
يمكن servletFileUpload ضبط الحجم وتشفير الملف الذي تم تحميله.
باختصار ، تعامل معالجة من جانب الخادم المعلمات التي تم الحصول عليها كأشكال HTML.
Public Void ProcessUpload (طلب httpservletrequest ، httpservletresponse استجابة)) if (! exploadfile.exists ()) {eploadfile.mkdirs () ؛ } system.out.println ("هيا ، حبيبي ......") ؛ request.setcharacterencoding ("UTF-8") ؛ استجابة. setcharacterencoding ("UTF-8") ؛ // الكشف عما إذا كان ملف التحميل موجودًا iSmultipart boolean = servletFileUpload.ismultipartContent (request) ؛ if (isMultipart) {diskfileItemFactory Factory = new DiskfileItemFactory () ؛ . // تعيين البيانات يتم تخزينها في دليل القرص الثابت عندما يتجاوز حجم الملف قيمة getizethreshold () factory.setRepository (ملف جديد ("d: // temp")) ؛ // قم بإنشاء ملف ServleTfileUpload لتحميل ملف جديد = servletfileupload (المصنع) ؛ // حدد الحد الأقصى لحجم ملف تم تحميله ، الوحدة: بايت ، ضبط على 50 ميغابايت expload.setFilesizeMax (50 * 1024 * 1024) ؛ // حدد الحجم الإجمالي للملفات المتعددة التي تم تحميلها في وقت واحد ، الوحدة: بايت ، تم تعيينها على 50 ميجابايت تحميل. SetSizemax (50 * 1024 * 1024) ؛ تحميل. قائمة <FileItem> عناصر = null ؛ حاول {// parse طلب طلب طلب = upload.parserequest (request) ؛ } catch (fileuploadexception e) {eprintStackTrace () ؛ } if (عناصر! = null) {// parse نموذج العنصر iterator <IpileItem> iter = items.iterator () ؛ بينما (iter.hasnext ()) {fileItem item = iter.next () ؛ // إذا كانت سمة نموذج عادية إذا كانت (item.isformfield ()) {// سمة الاسم المكافئة للإدخال هي <إدخال type = "text" name = "content"> string name = item.getFieldName () ؛ // سمة القيمة لقيمة سلسلة الإدخال = item.getString () ؛ System.out.println ("Property:" + name + "قيمة السمة:" + value) ؛ } // إذا كان يتم تحميل ملف آخر {// اسم السمة سلسلة fieldName = item.getFieldName () ؛ // تحميل ملف سلسلة مسار الملف = item.getName () ؛ filename = filename.subString (filename.lastindexof ("/") + 1) ؛ // الحصول على اسم ملف الملف الذي تم تحميله TRAWE {item.write (ملف جديد (uploadpath ، filename)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}}} review.addheader ("Token" ، "Hello") ؛ }بعد المعالجة ، يمكن للخادم تعيين معلومات بسيطة يتم إرجاعها إلى العميل في الرأس. إذا كان عميل الإرجاع عبارة عن دفق ، فيجب تعيين حجم الدفق مقدمًا!
استجابة.
3 تنزيلات الملفات
يمكن تنفيذ تنزيل الملف باستخدام getMethod of HTTPClient ، وطريقة HTTPGET وطريقة httpurlConnection الأصلية.
3.1 معالجة العميل
3.1.1 طريقة getMethod
httpclient هنا هو org.apache.commons.httpclient.httpclient.
تنزيل public void (سلسلة RemoteFilename ، String localFilename) {httpclient client = new httpclient () ؛ getMethod get = null ؛ FileOutputStream Output = null ؛ حاول {get = new getMethod (url_str) ؛ get.setRequestHeader ("اسم المستخدم" ، اسم المستخدم) ؛ get.setRequestHeader ("passwd" ، passwd) ؛ get.setRequestHeader ("filename" ، RemoteFilename) ؛ int i = client.executemethod (get) ؛ if (success == i) {system.out.println ("قيمة استجابة الرمز المميز:" + get.getResponseHeader ("token")) ؛ file storefile = ملف جديد (localfilename) ؛ الإخراج = fileOutputStream جديد (storefile) ؛ // احصل على مجموعة بايت من موارد الشبكة واكتب إلى File Output.write (get.getResponseBody ()) ؛ } آخر {system.out.println ("تنزيل ملف يحدث استثناء ، رمز الخطأ هو:" + i) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (output! = null) {output.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } get.releaseconnection () ؛ client.gethttpconnectionManager (). CloseIdleConnections (0) ؛ }}3.1.2 طريقة httpget
httpclient هنا تحت org.apache.http.client.methods.
تنزيل public void (String RemoteFilename ، String localFilename) {defaulthttpclient httpclient = new DefaulThTtpClient () ؛ OutputStream Out = null ؛ inputStream في = null ؛ حاول {httpget httpget = new httpget (url_str) ؛ httpget.addheader ("اسم المستخدم" ، اسم المستخدم) ؛ httpget.addheader ("passwd" ، passwd) ؛ httpget.addheader ("filename" ، RemoteFilename) ؛ httpresponse httpresponse = httpclient.execute (httpget) ؛ HTTPENTITY ENTITY = httpresponse.getentity () ؛ في = entity.getContent () ؛ طول طويل = entity.getContentLength () ؛ if (length <= 0) {system.out.println ("ملف التنزيل غير موجود!") ؛ يعود؛ } system.out.println ("قيمة استجابة الرمز المميز:" + httpresponse.getfirsTheader ("token")) ؛ ملف ملف = ملف جديد (localFilename) ؛ if (! file.exists ()) {file.createNewFile () ؛ } out = fileOutputStream (ملف جديد) ؛ Byte [] Buffer = New Byte [4096] ؛ int readlength = 0 ؛ بينما ((readlength = in.read (buffer))> 0) {byte [] bytes = new byte [readLength] ؛ System.ArrayCopy (Buffer ، 0 ، Bytes ، 0 ، readlength) ؛ out.write (بايت) ؛ } out.flush () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (in! = null) {in.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } حاول {if (out! = null) {out.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}3.1.3 طريقة httpurlconnection
public void download3 (String RemoteFilename ، String localFilename) {fileOutputStream Out = null ؛ inputStream في = null ؛ حاول {url url = url new (url_str) ؛ urlConnection urlConnection = url.openconnection () ؛ httpurlConnection httpurlConnection = (httpurlConnection) urlConnection ؛ // true - سوف تعيين المعلمات httpurlConnection.setDooutput (true) ؛ . // لن تستخدم caches httpurlconnection.setuseCaches (false) ؛ // تعيين httpurlconnection.setRequestProperty ("نوع المحتوى" ، "التطبيق/X-java-serialized-object") ؛ // الافتراضي هو الحصول على httpurlconnection.setRequestMethod ("post") ؛ httpurlconnection.setRequestProperty ("connection" ، "keep-alive") ؛ httpurlconnection.setRequestProperty ("charsert" ، "UTF-8") ؛ // 1 دقيقة httpurlconnection.setConnectTimeOut (60000) ؛ // 1 دقيقة httpurlconnection.setReadTimeout (60000) ؛ httpurlconnection.addrequestProperty ("اسم المستخدم" ، اسم المستخدم) ؛ httpurlconnection.addrequestProperty ("passwd" ، passwd) ؛ httpurlconnection.addrequestProperty ("filename" ، RemoteFilename) ؛ // الاتصال بالخادم (TCP) httpurlconnection.connect () ؛ في = httpurlConnection.getInputStream () ؛ // إرسال طلب إلى // ملف الخادم = ملف جديد (localfilename) ؛ if (! file.exists ()) {file.createNewFile () ؛ } out = fileOutputStream (ملف جديد) ؛ Byte [] Buffer = New Byte [4096] ؛ int readlength = 0 ؛ بينما ((readlength = in.read (buffer))> 0) {byte [] bytes = new byte [readLength] ؛ System.ArrayCopy (Buffer ، 0 ، Bytes ، 0 ، readlength) ؛ out.write (بايت) ؛ } out.flush () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (in! = null) {in.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } حاول {if (out! = null) {out.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}3.2 معالجة جانب الخادم
على الرغم من أن العميل يتعامل بشكل مختلف ، فإن الخادم هو نفسه.
Public Void ProcessDownload (طلب httpservletrequest ، استجابة httpservletresponse) {int buffer_size = 4096 ؛ inputStream في = null ؛ OutputStream Out = null ؛ System.out.println ("هيا ، حبيبي ......") ؛ حاول {request.setcharacterencoding ("UTF-8") ؛ استجابة. setcharacterencoding ("UTF-8") ؛ استجابة. username username = request.getheader ("اسم المستخدم") ؛ String passwd = request.getheader ("passwd") ؛ اسم ملف السلسلة = request.getheader ("filename") ؛ System.out.println ("اسم المستخدم:" + اسم المستخدم) ؛ System.out.println ("passwd:" + passwd) ؛ system.out.println ("filename:" + filename) ؛ // يمكن إجراء مزيد من المعالجة استنادًا إلى اسم المستخدم الذي تم تمريره و passwd ، مثل التحقق مما إذا كان الطلب قانونيًا ، إلخ استجابة. استجابة. int readlength = 0 ؛ في = جديد bufferedInputStream (FileInputStream جديد (ملف) ، buffer_size) ؛ Out = جديد bufferedoutputStream (response.getOutputStream ()) ؛ byte [] buffer = new byte [buffer_size] ؛ بينما ((readlength = in.read (buffer))> 0) {byte [] bytes = new byte [readLength] ؛ System.ArrayCopy (Buffer ، 0 ، Bytes ، 0 ، readlength) ؛ out.write (بايت) ؛ } out.flush () ؛ Response.addheader ("Token" ، "Hello 1") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Response.addheader ("Token" ، "Hello 2") ؛ } أخيرًا {if (in! = null) {try {in.close () ؛ } catch (ioException e) {}} if (out! = null) {try {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: GET ، HEAD ، POST ، PUT ، DELETE ، TRACE والخيارات. يستخدم التحميل أعلاه منشورًا ، والتنزيل يحصل.
حاليًا ، استخدم org.apache.commons.httpclient.httpclient أكثر. الأمر متروك لي ~
ما سبق هو جميع محتويات التحميل والتنزيل لاستخدام HTTPClient لتنفيذ الملفات. آمل أن يتمكن الجميع من دعم wulin.com أكثر ~