หมายเหตุ: รหัสต่อไปนี้ขึ้นอยู่กับ httpClient4.5.2
มันเป็นงานที่ง่ายกว่าในการใช้งาน Get Request Crawling ของหน้าเว็บโดยใช้ httpClient ของ Java:
สตริงคงที่สาธารณะ Get (String url) {closeablehttPresponsesponse = null; bufferedReader ใน = null; สตริงผลลัพธ์ = ""; ลอง {closeablehttpClienthttppClient = httpClients.createdefault (); httpgethttpget = ใหม่ httpget (url); การตอบสนอง = httppClient.execute (httpget); ใน = ใหม่ bufferedReader (ใหม่ inputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); สตริงบรรทัด = ""; String nl = system.getProperty ("line.separator"); ในขณะที่ ((line = in.readline ())! = null) {sb.append (บรรทัด + nl); } in.close (); ผลลัพธ์ = sb.toString (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (null! = ตอบสนอง) response.close (); } catch (ioexception e) {e.printstacktrace (); }} ผลการส่งคืน; -วิธีการข้างต้นยังมีประโยชน์เมื่อการดำเนินการหลายเธรดของการร้องขอ GET อย่างไรก็ตามคำขอแบบมัลติเธรดนี้ขึ้นอยู่กับการสร้างอินสแตนซ์ httpClient ทุกครั้งที่มีการเรียกวิธีการ แต่ละอินสแตนซ์ httpClient ถูกนำกลับมาใช้ใหม่หนึ่งครั้ง เห็นได้ชัดว่านี่ไม่ใช่การใช้งานที่ดีที่สุด
HttpClient จัดทำโซลูชันการร้องขอแบบหลายเธรดและคุณสามารถดูเอกสารอย่างเป็นทางการ "Pooling Connection Manager" การใช้งาน HttpClient การใช้งานแบบมัลติเธรดมีการใช้งานตามพูลการเชื่อมต่อในตัวซึ่งมีคลาสคีย์คือการรวมกลุ่ม htttpClientConnectionManager ซึ่งรับผิดชอบในการจัดการกลุ่มการเชื่อมต่อ HTTPClient มีสองวิธีหลักที่มีอยู่ใน PoolinghttpClientConnectionManager: setMaxtotal และ setDefaultMaxperRoute SetMaxtotal ตั้งค่าจำนวนสูงสุดของการเชื่อมต่อไปยังกลุ่มการเชื่อมต่อและ SetDefaultMaxPerRoute ตั้งจำนวนการเชื่อมต่อเริ่มต้นในแต่ละเส้นทาง นอกจากนี้ยังมีวิธีการ SetMaxperRoute - ตั้งค่าจำนวนสูงสุดของการเชื่อมต่อสำหรับไซต์บางแห่งแยกกันเช่นนี้:
httphosthost = ใหม่ httphost ("locahost", 80); CM.SetMaxperRoute (httproute ใหม่ (โฮสต์), 50);การดำเนินการตามคำขอของเราได้รับการปรับเล็กน้อยตามเอกสาร:
แพ็คเกจ com.zhyea.robin; นำเข้า org.apache.http.client.methods.closeablehttpresponse; นำเข้า org.apache.http.client.methods.httpget; นำเข้า org.apache.http.impl.client.closeablehttpclient org.apache.http.impl.conn.poolinghttpClientConnectionManager; นำเข้า java.io.bufferedreader; นำเข้า java.io.ioException; นำเข้า Java.io.InputStreamReader; ชั้นเรียนสาธารณะ httputil {private static closeablehttpclienthttpclient; Static {PoolinghttpClientConnectionManagerCm = ใหม่ poolinghttpClientConnectionManager (); CM.SetMaxtotal (200); CM.SetDefaultMaxperRoute (20); CM.SetDefaultMaxperRoute (50); httpClient = httpClients.custom (). setConnectionManager (cm) .build (); } สตริงคงที่สาธารณะรับ (rl url string) {closeablehttpresponsponse = null; bufferedReaderin = null; สตริงผลลัพธ์ = ""; ลอง {httpgethttpget = new httpget (url); การตอบสนอง = httpClient.execute (httpget); ใน = ใหม่ bufferedReader (ใหม่ inputStreamReader (response.getEntity (). getContent ())); StringBuffersb = new StringBuffer (""); สตริงบรรทัด = ""; String nl = system.getProperty ("line.separator"); ในขณะที่ ((line = in.readline ())! = null) {sb.append (บรรทัด + nl); } in.close (); ผลลัพธ์ = sb.toString (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (null! = ตอบสนอง) response.close (); } catch (ioexception e) {e.printstacktrace (); }} ผลการส่งคืน; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println (รับ ("https://www.baidu.com/")); -เกี่ยวกับเรื่องนี้ แต่สำหรับฉันฉันชอบการใช้งาน HTTP PClient อย่างคล่องแคล่ว ตัวอย่างเช่นคำขอ HTTP GET ที่เราเพิ่งใช้งานสามารถนำไปใช้ได้ง่ายเช่นนี้:
แพ็คเกจ com.zhyea.robin; นำเข้า org.apache.http.client.fluent.request; นำเข้า java.io.ioexception; คลาสสาธารณะ httputil {สตริงคงที่สาธารณะรับ (rl url string) {string result = ""; ลอง {result = request.get (url) .connecttimeout (1,000) .sockettimeout (1,000) .Execute (). returnContent (). assTring (); } catch (ioexception e) {e.printstacktrace (); } ผลตอบแทนผลลัพธ์; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println (รับ ("https://www.baidu.com/")); -สิ่งที่เราต้องทำคือแทนที่การพึ่งพา HTTPClient ก่อนหน้าด้วยการพึ่งพา Fluent-HC:
<Effercing> <roupId> org.apache.httpComponents </groupId> <ratifactId> Fluent-HC </artifactId> <cersion> 4.5.2 </version> </dependency>
และการใช้งานที่คล่องแคล่วนี้สามารถทำได้โดยธรรมชาติโดยใช้ PoolinghttpClientConnectionManager ค่าของ maxtotal และ defaultmaxperroute ที่ตั้งค่าคือ 200 และ 100 ตามลำดับ:
connMgr = ใหม่ poolinghttpClientConnectionManager (SFR); connmgr.setDefaultMaxperRoute (100); connmgr.setmaxtotal (200);
สิ่งเดียวที่ทำให้ผู้คนรู้สึกไม่พอใจคือผู้บริหารไม่ได้ให้วิธีการปรับค่าทั้งสองนี้ แต่ก็เพียงพอแล้ว หากไม่ได้ผลจริง ๆ คุณสามารถพิจารณาการเขียนใหม่ของวิธีการดำเนินการใหม่แล้วใช้ Executor โดยตรงเพื่อดำเนินการตามคำขอ GET:
Executor.NewInstance (). Execute (request.get (url)) .returnContent (). assTring ();
นั่นคือทั้งหมด!