ملاحظة: يعتمد الرمز التالي على httpclient4.5.2.
إنها مهمة أسهل لتنفيذ طلب Get Terming لزحف صفحات الويب باستخدام HTTPClient من Java:
السلسلة الثابتة العامة GET (url url) {closleableHTTPRespSonseSponse = null ؛ BufferedReader في = فارغة ؛ نتيجة السلسلة = "" ؛ حاول {closablehttpclienthtpclient = httpclients.createdefault () ؛ httpgethttpget = new httpget (url) ؛ استجابة = httppclient.execute (httpget) ؛ في = جديد bufferedReader (inputStreamReader جديد (reponse.getentity (). getContent ())) ؛ StringBuffersB = جديد StringBuffer ("") ؛ خط السلسلة = "" ؛ String nl = system.getProperty ("line.separator") ؛ بينما ((line = in.readline ())! = null) {sb.append (line + nl) ؛ } in.close () ؛ النتيجة = sb.toString () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (null! = response) response.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} نتيجة الإرجاع ؛ }الطريقة المذكورة أعلاه مفيدة أيضًا عند تنفيذ طلبات الحصول على طلبات GET. ومع ذلك ، يعتمد هذا الطلب متعدد الخيوط على إنشاء مثيل HTTPCLIENT في كل مرة يتم فيها استدعاء طريقة GET. يتم إعادة تدوير كل مثيل httpclient مرة واحدة. من الواضح أن هذا ليس تطبيقًا مثاليًا.
يوفر HTTPClient حل طلب متعدد الخيوط ، ويمكنك عرض المستند الرسمي "Polling Connection Manager". يتم تنفيذ طلبات HTTPClient متعددة الخيوط بناءً على تجمع الاتصال المدمج ، والذي يحتوي على فئة رئيسية ، وهي poolinghttpclientConnectionManager ، المسؤولة عن إدارة مجموعة اتصال HTTPClient. هناك طريقتان رئيسيتان متاحتان في poolinghttpclientConnectionManager: setMaxTotal و SetDefaultMaxperRoute. يعين SetMaxTotal الحد الأقصى لعدد الاتصالات إلى تجمع الاتصال ، ويقوم SetDefaultMaxperRoute بتعيين العدد الافتراضي للاتصالات على كل مسار. هناك أيضًا طريقة setMaxperRoute - اضبط الحد الأقصى لعدد الاتصالات لموقع معين بشكل منفصل ، مثل هذا:
httphosthost = new httphost ("locahost" ، 80) ؛ CM.SetMaxperRoute (Httproute (Httproute الجديد) ، 50) ؛يتم تعديل تطبيق طلب GET الخاص بنا قليلاً وفقًا للوثائق:
حزمة com.zhyea.robin ؛ استيراد org.apache.http.client.methods.closablehttpresponse ؛ import org.apache.http.client.methods.httpget ؛ import org.apache.http.impl.client.closablehttpclient ؛ import org.http.impl.httpclient ؛ org.apache.http.impl.conn.poolinghttpclientConnectionManager ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamreader ؛ الفئة العامة httputil {private static clovablehttpclienthttpclient ؛ ثابت {poolinghttpclientConnectionMerCmm = new poolinghttpclientConnectionManager () ؛ CM.SetMaxTotal (200) ؛ CM.SetDefaultMaxperRoute (20) ؛ CM.SetDefaultMaxperRoute (50) ؛ httpclient = httpclients.custom (). setConnectionManager (cm) .build () ؛ } السلسلة الثابتة العامة GET (String url) {closleablehttpresponsponse = null ؛ bufferredreaderin = null ؛ نتيجة السلسلة = "" ؛ حاول {httpgethttpget = new httpget (url) ؛ استجابة = httpclient.execute (httpget) ؛ في = جديد bufferedReader (inputStreamReader جديد (reponse.getentity (). getContent ())) ؛ StringBuffersB = جديد StringBuffer ("") ؛ خط السلسلة = "" ؛ String nl = system.getProperty ("line.separator") ؛ بينما ((line = in.readline ())! = null) {sb.append (line + nl) ؛ } in.close () ؛ النتيجة = sb.toString () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (null! = response) response.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} نتيجة الإرجاع ؛ } public static void main (string [] args) {system.out.println (get ("https://www.baidu.com/") ؛ }}هذا عن ذلك. لكن بالنسبة لي ، أفضل التنفيذ بطلاقة لـ HTTP Pclient. على سبيل المثال ، يمكن تنفيذ طلب HTTP الذي قمنا بتطبيقه ببساطة مثل هذا:
حزمة com.zhyea.robin ؛ استيراد org.apache.http.client.fluent.request ؛ استيراد java.io.ioException ؛ الفئة العامة httputil {السلسلة الثابتة العامة get (url url) {string result = "" ؛ حاول {result = request.get (url) .ConnectTimeout (1000) .SocketTimeOut (1000) .execute (). returncontent (). Asstring () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ } public static void main (string [] args) {system.out.println (get ("https://www.baidu.com/") ؛ }}كل ما علينا فعله هو استبدال التبعية السابقة HTTPClient مع التبعية بطلاقة HC:
<Rependency> <roupiD> org.apache.httpcomponents </groupId> <StifactId> Fluent-HC </artifactid> <الإصدار> 4.5.2 </version> </dependency>
ويتم تحقيق هذا التنفيذ بطلاقة بشكل طبيعي باستخدام poolinghttpclientConnectionManager. قيم maxtotal و defaultMaxperRoute التي تحددها هي 200 و 100 على التوالي:
connmgr = new poolinghttpclientConnectionManager (SFR) ؛ connmgr.setDefaultMaxperRoute (100) ؛ Connmgr.SetMaxTotal (200) ؛
الشيء الوحيد الذي يجعل الناس يشعرون بالضيق هو أن المنفذ لا يوفر وسيلة لضبط هاتين القيمتين. لكن هذا يكفي. إذا لم ينجح الأمر حقًا ، فيمكنك أيضًا التفكير في إعادة كتابة طريقة المنفذ ثم استخدام المنفذ مباشرة لتنفيذ طلب الحصول على:
Executor.NewInstance (). execute (request.get (url)) .returnContent (). Asstring () ؛
هذا كل شيء!