تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset
#1
السلام عليكم ورحمة الله وبركاته



نرحب بكم ساداتي الكرام في هذا الشهر الفضيل في اول موضوع من سلسلة [التعامل مع الويب]

تتكون السلسة من 3 مقالات مختلفة تتعلق بالتعامل مع الويب او صفحات الويب

اتت فكرة الموضوع منذ فترة في بالي ، حيث لا يوجد مصدر عربي واحد

يتكلم عن التعامل مع الويب ، فهذا هو الموضوع الاول والحصري

للتعامل مع الطلبات والويب
، في الحقيقة كان من المفترض ان

تكون المقالة على لغتي VB + سي شارب ، ولكن

احس ان السي شارب مظلومة شوي فقررت اجعل الدروس حصريا لها

بالاضافة ان المقالة طويلة نوعا ما فوجود اكواد كثيرة يربك القارئ ويربكني ايضاCool

إن شاء الله تنفعكم المقالة والمقالات القادمة

ونبدأ معكم اخواني الاعزاء مقالتنا الجميلة.Wink





--
--
--




صفر :-   أجزاء المقالة



1- تعريف طلبات الويب (Web requset)
2- بروتوكولات طلبات الويب
3- خصائص وطرق كائن ارسال الطلبات
4- جلب صيغة الطلب
5- ارسال الطلب
6.1- استخدام Cookies Container مع الطلبات
6.2- طريقة استخدام الطلبات لتسجيل الدخول في المنتدى
7- طريقة استخدام الطلبات لرفع البيانات لمراكز الرفع
8- التعامل مع سيرفر الFTP باستخدام كائن ارسال طلبات FTP
9- الخاتمة





--
--
--




اولا :-  تعريف الطلب


الطلب هو بيانات ترسلها لخادم الويب(Server) لكي يقوم بعمل ما.
كل طلب يتم ارساله للسيرفر ، يتم استقبال رد (Response) عليه

فاتسجيل الدخول للمنتديات مثلا ، يتم بالضغط على زر Log in في المنتدى
عندما يتم الضغط على الزر ، يرسل المتصفح طلبا يحتوي على بيانات العضوية

يتلقى الخادم الطلب ويعالجه (يبحث في قاعدة البيانات) ويرسل ردا يحتوي على بيانات
يترجم المتصفح الرد ويعرض لك المحتوى المترجم .



سنتعلم ان شاء الله كيفية الاستغناء عن المتصفحات وارسال الطلبات وتلقي الردود وعرض محتوى الرد او معالجته



--
--
--




ثانيا :-  بروتوكولات الطلبات


يوجد العديد من البروتوكلات المستخدمة في ارسال الطلبات
ابرزها :-

-
1- Post : وهو البروتوكول الاكثر شيوعا وسنتخدمه كثيرا ،
هذا البروتوكول يستخدم لـ إرسال معلومات من المستخدم الزبون (من form في صفحة html مثلا) للخادم ، مثلا
انشاء موضوع في المنتدى يتطلب ارسال بيانات (العنوان ، نص الموضوع ، الكلمات الدلالية ....الخ)
او تسجيل الدخول للمنتدى ، او البحث -- كل هذا يتم عبر Post Requset


2- Get : وهو بروتوكول يستخدم لعرض طلبك (صورة-ملف-صفحة Html ,وغيرها)
مثلا لو اريد ان اعرض صفحة قوقل الرئيسية ، اقوم بإرسال طلب Get ، ثم يرسل لي الخادم
ردا (Response) يحتوي على اكواد Html للصفحة



3- Head : هو برتوكول مشابه كثيرا لـ Get ،
الـ Get يقوم بجلب طلبك(صورة-صفحة-ملف) مع شيئ اسمه Response header
لكن الـHead يقوم بجلب Response header فقط دون جلب المحتوى - يعني لو اردت
الإستعلام عن مساحة ملف فقط استخدم Head ولا يجوز Get ، لأن Get راح تجلب لي المحتوى ، يعني بتعطينا الBytes للملف
>الـ Response header هي معلومات عن الرد يرسلها لك السيرفر عند تلقي الطلب<

سنتعرف على الـResponse Header و Request Header لاحقا


4- Put : بروتوكول يستخدم لرفع ملف
-



هذي البروتوكولات المشهورة ولاحاجة لذكر غيرها
للمزيد عن هذه البروتولات قم بزيارة الرابط التالي : هنا



--
--
--




ثالثا :-  كائن ارسال الطلبات


الفئة السحرية التي تمكننا من ارسال الطلبات اسمها HttpWebRequset ضمن مجال الاسماء System.Net

والفئة التي تمكننا من اسقبال الردود اسمها HttpWebResponse ضمن مجال الاسماء System.Net

هاتان الفئتان كلاهما abstract

اي لايمكنك عمل نسخة منهما

فلتعريفها نكتب التالي :


PHP كود :
HttpWebRequest rq = (HttpWebRequest)WebRequest.Create("http://www.google.com"); 


قمنا بتعريف كائن وقما بإنشاء طلب.

لاتنسى اضافة مجال الاسماء في اعلى المحرر :


PHP كود :
using System.Net




--

لن نحاول ان نرسل طلبا الان ، في هذا الجزء من المقالة سنقوم بـ شرح بعض الدوال والخصائص المهمة

--



خصائص كائن ارسال الطلب (HttpWebRequset)


1- خاصية Address : تعطيك رابط الطلب

2- خاصية AllowAutoRedirect : السماح للسيرفر بتحويل رابط الطلب الى رابط اخر

3- خاصية ContentLength : سحب او اعطاء طول بيانات الطلب

4- خاصية ContentType : سحب او اعطاء نوع الطلب - مهم جدا لطلبات بروتوكول POST

5- خاصية CookieContainer : سحب او اعطاء حاوية الكوكيز - سنتعرف لها لاحقا

6- خاصية Credentials : سحب او اعطاء بيانات الوصول مثلا(USERNAME او PASSWORD) - كسيرفرات FTP على سبيل المثال

7- خاصية KeepAlive : سحب او اعطاء قيمة تعبر عن استمرارية الاتصال مع السيرفر - تستعمل عند رفع الملفات عادا كي لاينقطع الاتصال

8- خاصية Method : من اهم الخواص - تستعمل لإختيار البروتوكول المستعمل للطلب (POST, GET , ...etc)

9-خاصية Timeout : الوقت المحدد لإلغاء الطلب في حالة عدم استجابة السيرفر اوعدم وصول الرد في الوقت المحدد

10- خاصية UserAgent : وكيل المستخدم - هو نص يعبر عن المتصفح المستخدم في الطلب (او المنصة الحالية) عادا
تظهر الفائدة الكبرى لهذه الخاصية عندما يكون تطبيقك لعدة منصات فمثلا ، اجهزة الجوال تعرض صفحات الويب بشكل اخر عن الكمبيوتر
جرب تدخل الyoutube من جوالك وشوف ، هنا تم استعمال UserAgent خاص عند طلب فتح صفحة اليوتيوب لكي تعرض بشكل الجوال ، لا بشكل الكمبيوتر المعتاد



--


إجرائات ودوال كائن ارسال الطلب (HttpWebRequset)


1- الاجراء Abort : الغاء الطلب

2- دالة GetRequestStream : فتح تيار كتابة البيانات للطلب - مهم جدا ، فهنا نكتب بيانات الطلب ، كبيانات العضوية او بيانات ملف الخ...

3- دالة GetResponse : ارسال الطلب + جلب الرد ، دالة دائما وابدا تستخدم في الطلب حيث ان الطلب لايتم الى باستدعائها



هكذا انتهينا من الدوال والخصائص المهمة




--
--
--





رابعا :-  جلب صيغة الطلب


نبدأ الان الشغل العملي في هذا الجزء

في البداية ماذا نريد ان نفعل ؟!!

كبداية نريد ان نقوم بإرسال طلب لتحويل كود bb to html عبر موقع وعرض صفحة النتائج في اداة WebBrowser

الان وقد حددنا الهدف - نقوم بداية بتنزيل اضافة الفايرفوكس live http headers من هنا

هذه الاضافة السحرية الي تعرض لنا كل مايحصل عندما يقوم المتصفح بإرسال طلب .

نقوم بتنزيلها وتركيبها .

اذهب الى الموقع وقم بفتح نافذة الاضافة

صورة :


هذه نافذة الاضافة



اوقف قنص الطلبات وقم بكتابة النص الذي تريد تحويله في خانة الكود



وقبل ان تضغط تحويل قم بتفعيل القنص

واضغط تحويل ، وفور ظهور صفحة النتائج



قم[/COLOR] بإلغاء القنص

ستكون معلومات الطلب كالتالي :


فسيكون الكود كالتالي

PHP كود :
           Encoding charset Encoding.GetEncoding("iso-8859-1");
 
           string stringData string.Format("bbcode={0}&submit=Convert+BBCode+to+HTML&alt=yes&xhtml=yes""[u]ABO MUSLEM[/u]");
 
           byte[] postData charset.GetBytes(stringData);

 
           HttpWebRequest rq = (HttpWebRequest)WebRequest.Create("http://bbcode-to-html.com");
 
           rq.Method WebRequestMethods.Http.Post;
 
           rq.ContentType "application/x-www-form-urlencoded";
 
           rq.ContentLength postData.Length;
 
           System.IO.Stream wr rq.GetRequestStream();
 
           wr.Write(postData,0,postData.Length);
 
           wr.Close();

 
           HttpWebResponse rs = (HttpWebResponse)rq.GetResponse();

 
           System.IO.StreamReader reader = new System.IO.StreamReader(rs.GetResponseStream(), charset);

 
           webBrowser1.DocumentText reader.ReadToEnd(); 



--
--
--





خامسا :-  ارسال الطلب



شرح الاكواد السابقة :-


في السطر الاول قمنا بتعريف ترميز وهذا امر ضروري جدا لبيانات الطلب - حيث ان الطلب لايتم اذا كان الترميز خاطئ
<جلب الترميز يتم بعدة طرق منها اليدوية ومنها الالية>
الطربقة الالية هي باستعمال طلب اخر في دالة كالتالي
PHP كود :
       public Encoding getEncoding(string url)
 
       {
 
           HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url);
 
           HttpWebResponse rs = (HttpWebResponse)rq.GetResponse();
 
           return Encoding.GetEncoding(rs.CharacterSet);
 
       

واستبدال السطر الاول برابط الموقع
PHP كود :
Encoding charset getEncoding("http://bbcode-to-html.com"); 


الطريقة اليدوية :- موجود في سورس الصفحة نوع الترميز المستخدم ضمن الTag Head


--

السطر الثاني : بيانات الطلب ونحصل عليه في الاضافة (الصورة تحت)


يتم الفصل بين بارمترات البيانات بـ &

فنقوم باستبدال المتغيرات والحفاظ على الثوابت
PHP كود :
string.Format("bbcode={0}&submit=Convert+BBCode+to+HTML&alt=yes&xhtml=yes""[u]ABO MUSLEM[/u]"

الكود في الاداة
كود :
bbcode=[color=#FF0000]%5BB%5Dmohammed%5B%2FB%5D[/color][color=#40E0D0]&[/color]submit=Convert+BBCode+to+HTML[color=#40E0D0]&[/color]alt=yes[color=#40E0D0]&[/color]xhtml=yes

انا قمت بحذف %5BB%5Dmohammed%5B%2FB%5D

فهذا يعبر عن النص الذي نريد ان نحوله

ووضعت هذا بداله لكي يتم تحويله

PHP كود :
"[u]ABO MUSLEM[/u]" 

--
السطر الثالث
PHP كود :
byte[] postData charset.GetBytes(stringData); 

تعريف متغير من نوع مصفوفة byte

ويتم تحويل نص البيانات الى بايتات

لأن عشان نرسل طلب لازم تكون البيانات بصيغة البايت


--
السطر الرابع
PHP كود :
HttpWebRequest rq = (HttpWebRequest)WebRequest.Create("http://bbcode-to-html.com"); 

إنشاء طلب

وقمنا بوضع رابط الطلب

كما هو موضح رابط الطلب يوجد في اعلى الهيدر للطلب




--

السطر الخامس

PHP كود :
rq.Method WebRequestMethods.Http.Post

البروتوكول المستخدم لإرسال الطلب وهو موجود في الاضافة (الصورة فوق)


--

السطر السادس
PHP كود :
rq.ContentType "application/x-www-form-urlencoded"

كود مهم جدا - ولا يمكن ارسال طلب POST اذا لم يكن موجود

ونقدر نحصل عليه من الاضافة


--

السطر السابع
PHP كود :
rq.ContentLength postData.Length

طول بيانات الطلب = طول مصفوفة البيانات

كود مهم جدا للإرسال POST


--

الكود الثامن
PHP كود :
System.IO.Stream wr rq.GetRequestStream(); 

جلب تيار الكتابة لكي نكتب بيانات الطلب

--

الكود التاسع
PHP كود :
wr.Write(postData,0,postData.Length); 

نكتب بياناتنا

--

الكود العاشر
PHP كود :
HttpWebResponse rs = (HttpWebResponse)rq.GetResponse(); 

ارسال الطلب + جلب الرد

--

الكود الحادي عشر
PHP كود :
System.IO.StreamReader reader = new System.IO.StreamReader(rs.GetResponseStream(), charset); 

جلب تيار القراءة لكي نقرأ الرد بواسطة دالة مهمة في فئة HttpWebRespons
وهي GetResponseStream



--

الكود الثاني عشر وهو الحاسم
PHP كود :
webBrowser1.DocumentText reader.ReadToEnd(); 

دالةReadToEnd تجلب لك محتوى الرد

ونقوم بعرض المحتوى في اداة الwebbrowser


النتيجة :



تم تحويل

PHP كود :
[u]ABO MUSLEM[/u
في كود :
PHP كود :
string stringData string.Format("bbcode={0}&submit=Convert+BBCode+to+HTML&alt=yes&xhtml=yes""[u]ABO MUSLEM[/u]"); 


الى صيغة الhtml

PHP كود :
<p><span style="text-decoration: underline;">ABO MUSLEM</span></p

وذلك عبر ارسال طلب لموقع http://bbcode-to-html.com
-
انتهينا من هذا الجزء (ارسال الطلب)


>لاتقلق اذا لم تفهم ففي جعبتنا العديد من التطبيقات القادمة<




--
--
--




{يتبع الجزء السادس} >>>
الرد }}}


الردود في هذا الموضوع
[سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset - بواسطة الشاكي لله_mybb_import4784 - 06-08-13, 01:36 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سلسلة ادوات المبرمج] {1} - اداة مراقبة الريجستري RegFromApp الشاكي لله 2 5,469 15-09-24, 11:36 AM
آخر رد: بوحمد
  [سلسلة التحكم] {4} - التحكم عن بعد بواسطة خدمة الويب الشاكي لله 7 10,119 12-07-21, 02:34 PM
آخر رد: devante.celvin
  [سلسلة التحكم] {5} - التحكم بالمصباح بواسطة الـ USB و Arduino الشاكي لله 12 25,953 30-12-19, 01:38 AM
آخر رد: mohammed abdalsamed
  [سلسلة التحكم] {3} - خدمة الويب (Web Service) الشاكي لله 9 13,384 25-09-19, 05:47 PM
آخر رد: al9atl
  تجميعية مقالات [سلسلة التحكم] الشاكي لله 10 8,107 15-07-19, 09:14 AM
آخر رد: mrsalnet
  التعامل مع ملفات xml بلغتي C#&VB Sajad 7 14,605 08-11-17, 10:21 AM
آخر رد: nani49
  [C#.NET] سلسلة حلقات نضف كودك Devahmedsalim 1 2,892 10-10-17, 11:28 PM
آخر رد: nani49
  [سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder الشاكي لله 10 9,044 30-08-17, 06:49 PM
آخر رد: ابو روضة
  [سلسلة التحكم] {2} - التحكم بواسطة Remoting الشاكي لله 8 10,951 06-12-16, 04:22 PM
آخر رد: الشاكي لله
  [سلسلة التعامل مع الويب] تحليل الصفحات باستخدام HtmlAgilityPack الشاكي لله 9 7,469 25-09-16, 12:19 PM
آخر رد: ابراهيم كركوكي

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم