HttpClient هي مكتبة تنفيذ اتصالات HTTP من جانب العميل. الهدف من HttpClient هو إرسال واستقبال رسائل HTTP.
أعتقد أنني لست بحاجة إلى قول المزيد عن أهمية بروتوكول Http مقارنةً بـ URLConnection الذي يأتي مع JDK التقليدي، فقد زاد HttpClient من سهولة الاستخدام والمرونة (سنناقش الاختلافات المحددة في المستقبل). إنها ليست مجرد وسيلة للعميل لإرسال طلبات Http، بل إنها تسهل أيضًا على المطورين اختبار الواجهة (استنادًا إلى بروتوكول HTTP)، مما يؤدي إلى تحسين كفاءة التطوير وتحسين قوة التعليمات البرمجية. لذلك، فإن إتقان HttpClient مهم جدًا وإلزامي بعد إتقان HttpClient، أعتقد أن فهم بروتوكول Http سيكون أعمق.
1. مقدمة
HttpClient هو مشروع فرعي ضمن Apache Jakarta Common، يُستخدم لتوفير مجموعة أدوات برمجة عميل فعالة وحديثة وغنية بالميزات تدعم بروتوكول HTTP، وتدعم أحدث إصدار وتوصيات لبروتوكول HTTP. تم استخدام HttpClient في العديد من المشاريع، على سبيل المثال، هناك مشروعان مشهوران آخران مفتوحا المصدر على Apache Jakarta، Cactus وHTMLUnit، وكلاهما يستخدم HttpClient.
عنوان التنزيل: http://hc.apache.org/downloads.cgi
2. الخصائص
1. استنادًا إلى لغة جافا القياسية والنقية. تم تنفيذ Http1.0 وHttp1.1
2. ينفذ جميع أساليب Http (GET، POST، PUT، DELETE، HEAD، OPTIONS، و TRACE) ببنية قابلة للتوسيع موجهة للكائنات.
3. دعم بروتوكول HTTPS.
4. إنشاء اتصال شفاف من خلال وكيل HTTP.
5. استخدم طريقة CONNECT لإنشاء اتصال https نفقي من خلال وكيل Http.
6. Basic، Digest، NTLMv1، NTLMv2، جلسة NTLM2، نظام مصادقة SNPNEGO/Kerberos.
7. نظام المصادقة المخصص للمكونات الإضافية.
8. مصنع المقبس المحمول والموثوق يجعل من السهل استخدام حلول الطرف الثالث.
9. يدعم مدير الاتصال التطبيقات متعددة الخيوط. يدعم تحديد الحد الأقصى لعدد الاتصالات، وكذلك تحديد الحد الأقصى لعدد الاتصالات لكل مضيف، واكتشاف الاتصالات منتهية الصلاحية وإغلاقها.
10. التعامل مع ملفات تعريف الارتباط تلقائيًا في Set-Cookie.
11. سياسة ملفات تعريف الارتباط المخصصة للمكونات الإضافية.
12. يمكن أن يتجنب دفق إخراج الطلب تخزين المحتوى الموجود في الدفق مؤقتًا مباشرة إلى خادم المقبس.
13. يمكن لتدفق الإدخال للاستجابة قراءة المحتوى المقابل بشكل فعال مباشرة من خادم المقبس.
14. استخدم KeepAlive للحفاظ على الاتصالات المستمرة في http1.0 وhttp1.1.
15. الحصول مباشرة على رمز الاستجابة والترويسات المرسلة من قبل الخادم.
16. القدرة على ضبط مهلة الاتصال.
17. دعم تجريبي للتخزين المؤقت للاستجابة http1.1.
18. كود المصدر متاح مجانًا بموجب ترخيص Apache.
3. كيفية الاستخدام
من السهل جدًا استخدام HttpClient لإرسال الطلبات وتلقي الاستجابات، وبشكل عام، يلزم اتباع الخطوات التالية.
1. قم بإنشاء كائن HttpClient.
2. قم بإنشاء مثيل لطريقة الطلب وحدد عنوان URL للطلب. إذا كنت بحاجة إلى إرسال طلب GET، فقم بإنشاء كائن HttpGet؛ وإذا كنت بحاجة إلى إرسال طلب POST، فقم بإنشاء كائن HttpPost.
3. إذا كنت بحاجة إلى إرسال معلمات الطلب، فيمكنك استدعاء طريقة setParams (HetpParams) الشائعة في HttpGet وHttpPost لإضافة معلمات الطلب لكائن HttpPost، ويمكنك أيضًا استدعاء طريقة setEntity (كيان HttpEntity) لتعيين الطلب؛ حدود.
4. قم باستدعاء تنفيذ (طلب HttpUriRequest) لكائن HttpClient لإرسال الطلب. تقوم هذه الطريقة بإرجاع HttpResponse.
5. استدعاء getAllHeaders () الخاص بـ HttpResponse وgetHeaders (اسم السلسلة) وطرق أخرى للحصول على رؤوس استجابة الخادم؛ واستدعاء طريقة getEntity () الخاصة بـ HttpResponse للحصول على كائن HttpEntity، الذي يغلف محتوى استجابة الخادم. يمكن للبرنامج الحصول على محتوى استجابة الخادم من خلال هذا الكائن.
6. قم بتحرير الاتصال. بغض النظر عما إذا كانت طريقة التنفيذ ناجحة أم لا، يجب تحرير الاتصال
4. أمثلة
package com.test; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; import javax.net.ssl.SSLContext; import org.apache.http.HttpEntity; org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost ؛يستورد org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustSignedStrategy; import org.apache.http.entity.ContentType; org.apache.http.entity.mime.MultipartEntityBuilder import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl .client.HttpClients; import org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get(); /** * يتصل HttpClient بـ SSL */ public void ssl() { CloseableHttpClient httpclient = null; حاول { KeyStore TrustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); Try { // تحميل keyStore d://tomcat.keystore TrustStore.load(instream , "123456".toCharArray()); }catch (CertificateException e) { e.printStackTrace(); { instream. Close(); } Catch (تجاهل الاستثناء) { } } // ثق بالمرجع المصدق الخاص بك وجميع الشهادات الموقعة ذاتيًا SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() // السماح فقط باستخدام بروتوكول TLSv1 SSLConnectionSocketFactory sslsf = new ; SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); جديد HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("تنفيذ الطلب" + httpget.getRequestLine()); CloseableHttpResponse Response = httpclient.execute(httpget); { كيان HttpEntity = Response.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("طول محتوى الاستجابة: "+ الكيان.getContentLength()); System.out.println(EntityUtils.toString (الكيان)); EntityUtils.consume(entity); (ParseException e) { e.printStackTrace(); } Catch (IOException e) { e.printStackTrace(); } Catch (KeyManagementException e) { e.printStackTrace(); } Catch (NoSuchAlgorithmException e) { e.printStackTrace(); } Catch (KeyStoreException e) { e.printStackTrace() } أخيرا { if (httpclient != null) { حاول { httpclient. Close ()؛ } Catch (IOException e) { e.printStackTrace() } } } } /** * إرسال النموذج في وضع النشر (محاكاة طلب تسجيل دخول المستخدم) */ public void postForm() { // إنشاء مثيل httpClient افتراضي CloseableHttpClient httpclient = HttpClients.createDefault(); // إنشاء httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // إنشاء قائمة انتظار المعلمات List<namevaluepair>formparams = new ArrayList<namevaluepair>();formparams.add(new BasicNameValuePair("username" , "admin"));formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity; حاول { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("تنفيذ الطلب" + httppost.getURI()); (httppost); كيان HttpEntity = Response.getEntity(); if (entity != null) { System.out.println("-------------------------- ------------"); System.out.println("محتوى الاستجابة: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } } أخيرا {استجابة.إغلاق(); } } يمسك (ClientProtocolException e) { e.printStackTrace(); } Catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } Catch (IOException e) { e.printStackTrace() } أخيرًا { // أغلق الاتصال وحرر الموارد حاول { httpclient .Close(); } Catch (IOException e) { e.printStackTrace(); أرسل طلب نشر للوصول إلى التطبيق المحلي وإرجاع نتائج مختلفة وفقًا لمعلمات مختلفة تم تمريرها */ public void post() { // إنشاء مثيل httpClient افتراضي = new HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action"); إنشاء قائمة انتظار المعلمات List<namevaluepair>formparams = new ArrayList<namevaluepair>();formparams.add(new BasicNameValuePair("type", "house" uefEntity; محاولة { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8" "); httppost.setEntity(uefEntity); System.out.println("تنفيذ الطلب" + httppost.getURI()); CloseableHttpResponse Response = httpclient.execute(httppost); محاولة { HttpEntity الكيان = Response.getEntity(); .println("-----------------------------------------"); .out.println ("محتوى الاستجابة:" + EntityUtils.toString(entity, "UTF-8")); System.out.println("----------------------------- ---------"); } } أخيرًا {استجابة.إغلاق(); } } Catch (ClientProtocolException e) { e.printStackTrace(); } Catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } قبض (IOException ه) { e.printStackTrace(); } أخيرا { // أغلق الاتصال وحرر الموارد حاول { httpclient. Close() } Catch (IOException e) { e.printStackTrace() } } /** * إرسال طلب الحصول* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); حاول { // إنشاء httpget httpget = new HttpGet("http://www.baidu.com/"); System.out.println("تنفيذ الطلب" + httpget.getURI()); حاول { // احصل على كيان الاستجابة HttpEntity الكيان = Response.getEntity(); System.out.println("--------------------------" ----------"); // طباعة حالة الاستجابة System.out.println(response.getStatusLine()); if (entity != null) { // طباعة طول محتوى الاستجابة System.out.println("طول محتوى الاستجابة: " + الكيان.getContentLength()); // اطبع محتوى الاستجابة System.out.println("محتوى الاستجابة: " + EntityUtils.toString(entity)); System.out.println("-------------------------------------------------------"); } أخيرا { استجابة .إغلاق ()؛ } } Catch (ClientProtocolException e) { e.printStackTrace() } Catch (ParseException e) { e.printStackTrace(); } Catch (IOException e) { e.printStackTrace() } أخيرًا { // أغلق الاتصال وحرر الموارد حاول { httpclient.إغلاق () } Catch (IOException e) { e.printStackTrace(); } } } /** * تحميل الملفات*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); Try { HttpPost httppost = new HttpPost("http://localhost: 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = new FileBody(new File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("ملف ثنائي من نوع ما"، ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin" "، bin).addPart("comment"، comment).build(); httppost.setEntity(reqEntity); System.out.println("تنفيذ الطلب" + httppost.getRequestLine()); CloseableHttpResponse Response = httpclient.execute(httppost); -----------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = Response. getEntity() ; إذا (resEntity != null) { System.out.println("طول محتوى الاستجابة: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity) } أخيرًا {response() } } Catch (ClientProtocolException e) { e.printStackTrace(); } Catch (IOException e) { e.printStackTrace() } أخيرًا { حاول { httpclient. Close(); } Catch (IOException e) { e.printStackTrace() } } } </namevaluepair></namevaluepair></namevaluepair></namevaluepair>
يستخدم هذا المثال أحدث إصدار من HttpClient4.3. يختلف هذا الإصدار تمامًا عن أسلوب كتابة التعليمات البرمجية السابق، لذا يرجى الانتباه أكثر.
حسنًا، ما ورد أعلاه هو كامل محتوى هذه المقالة، أتمنى أن ينال إعجابك.