Http Request در سی شارپ (ارسال و دریافت اطلاعات از سرور)

چهارشنبه 7 آبان 1399

http یک پروتکل برای انتقال ابر متن است که در زمینه هایی مانند سامانه دامین (DNS) کاربرد دارد. هر نرم افزار احتیاج به بروز رسانی اطلاعات از طرف سرور دارد و اینکار رو ما بهش Http Request می گوییم. Http Request از دو کلمه Http و کلمه Request تشکیل شده است که به معنای درخواست دادن از پروتکل Http می باشد و ما با استفاده از Http Request به سرور در خواست می فرستیم و از سرور یک سری اطلاعاتی رو مطالبه می کنیم (GET) و همینطور برای سرور یک سری اطلاعاتی رو ارسال می کنیم (POST)

Http Request در سی شارپ (ارسال و دریافت اطلاعات از سرور)

همانطور که گفته شد نرم افزار ها ، احتیاج دارند که بروزرسانی بشوند. اما نمی شود برای هر تغییر کوچکی در اطلاعات ، بياییم و یک نسخه دیگر وارد بازار کنیم. در واقع باید اطلاعات را از طریق یک وب سرور ، فراخوانی کرده و دریافت کنیم (GET) و سپس مقادیری رو به سرور بدهیم (POST).

سرور و هاست مکانی هستند در اینترنت برای ذخیره اطلاعات ، به عنوان مثال همین سایت برنامه نویسان ، بر روی یک سرور اطلاعات خودش ، شما و من رو ذخیره می کنه و در هنگام نیاز از اونها استفاده می کنه. مثلا شما اومدین داخل مقاله "Http Request در سی شارپ" ، خب حالا سایت به سرور درخواست میفرسته (Request) و از سرور متن ها و بقیه چیزا رو می خواد (GET) و سرور بهش اطلاعات رو میده (Response) . حالا شما فرض کنید که میاید و یک نظر ارسال می کنید ، اینجا سایت به سرور ، اطلاعات شما مثلا نام کاربری شما و متنی که فرستادید رو به سرور میفرسته (POST) و سرور هم اونها رو در بانک اطلاعاتی خودش ذخیره می کنه تا بعدا هنگام بارگذاری صفحه ، سایت دوباره از سرور همون ها رو مطالبه می کنه(GET) .

خب نرم افزار ما اینجا با فرستادن اطلاعات به سرور اطلاعاتي هم از بان اطلاعاتی سرور دريافت می کنه (GET) که یکی از اونها میتونه نام صاحب کارت باشه.

خب امیدوارم متوجه شده باشید که برای چی از http request استفاده می کنیم.

حالا بریم سراغ http request در سی شارپ

خب http request اسمش خیلی راحته ، http رو که میدونید توضیح دادیم می مونه کلمه request. درواقع وتی که شما یک درخواستی رو به سرور ارسال می کنید بهش میگن request  و وقتی که یک پاسخ از سرور دریافت می کنید بهش میگن ، response. در واقع http request یعنی درخواست از طریق http و ما میخوایم این کار رو با زبان شیرین و باحال و دوست داشتنی سی شارپ انجام بدهیم

در زبان برنامه نویسی C# . netfreamwork برای استفاده از Http Request ، باید از کتابخانه System.Net.Http استفاده کنیم بصورت زیر :

using System.Net.Http;
					

حالا به کد زیر یک نگاهی بندازید :

         private WebRequest _request;
        
         public MyWebRequest(string url)
        {
            // Create a request using a URL that can receive a post.

            _request = WebRequest.Create(url);
        }

در اینجا ما یک متد ساده درخواست (GET) داریم که همونطور که می بینید یک آدرس (url) در یافت می کند و اون رو فراخوانی می کند. جالب اینجاست که اون هم هم جوابی میفرستد و نرم افزار دریافت می کند.

در کد بالا ، ما از یک شئی از جنس WebRequest تعریف کردیم به اسم request_ تعریف کردیم که ازش به عنوان ذخیره کننده مقادیر دریافتی استفاده می کنیم  و یک متد تعریف کردیم به اسم MyWebRequest که یک پارامتر از جنس رشته (String) دریافت می کند به نام url که این نشانی از همان سرور ماست که قراره بهش درخواست بدهیم و مقادیری رو که بر می گردونه رو دریافت کنیم

داخل متد ما مقادیری برگشتی از سرور رو داخل request_ ریختیم که از جنس WebRequest هستش و میتونه اون مقادیر رو در خودش نگه داره.

حالا یک متد پیچیده تر رو ببینید که میتواند هم درخواست بدهد (متد GET) و هم می تواند مقادیری رو بفرستد (متد POST) :

         private WebRequest _request;
        
		public MyWebRequest(string url, string method)
        {

            if (method.Equals("GET") || method.Equals("POST"))
            {
                // Set the Method property of the request to POST.
                
               _request.Method = method;
               
               // Create a request using a URL that can receive a post.

               _request = WebRequest.Create(url);

            }
            else
            {
                throw new Exception("Invalid Method Type");
            }
         }

خب اینجا هم همون ماجرا بالا رو داریم با این تفاوت که متد یه خورده ای عوض شده. بله همونطور که همتون می دونید ما اینجا یه شرط تعریف کردیم و یک پارامتر به پارامتر های متد MyWebRequest اضافه شده. پارامتر جدید ما ، اسمش Method هستش که مشخص می کنه مای میخوایم از سرور اطلاعات بگیریم (GET) یا می خوایم بهش اطلاعات بدهیم (POST) . همچنین داخل متد هم یک شرط اضافه کردیم که میگه اگر (if) مقدار پارامتر method برابر با GET یا POST بود ، در ابتدا متد درخواست (request.Method_) رو تنظیم کن و سپس پاسخ سرور رو در متغیر request_ بریز ولی اگر پارامتر method برابر با GET یا POST نبود ، یک خطا بده و بگو متدی که وارد کردی ناشناسه ("Invalid Method Type").

اما ، این متد ها یه ایرادی داشتن، فقط درخواست می دادن ، ولی نمی گفتن چی می خوایم یا می خوایم چی بدیم. فقط یا می گفتن بگیر (POST) یا هم می گفتن بده (GET) که خب این خوبه ولی در صورتی که سرور فقط یک نوع اطلاعات بخواد یا یک نوع اطلاعات داشته باشه که بده ولی اگر ما بخوایم اطلاعات خاصی رو بدیم یا بگیریم باید از متد های یخورده پیچیده تر استفاده کنیم :

        private WebRequest _request;
        private Stream _dataStream;
        
        public MyWebRequest(string url, string method, string data)
        {

            if (method.Equals("GET") || method.Equals("POST"))
            {
            
              // Set the Method property of the request to POST.
                
             _request.Method = method;
               
             // Create a request using a URL that can receive a post.

             _request = WebRequest.Create(url);
               
            // Create POST data and convert it to a byte array.
            
            string postData = data;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Set the ContentType property of the WebRequest.
            _request.ContentType = "application/x-www-form-urlencoded";

            // Set the ContentLength property of the WebRequest.
            _request.ContentLength = byteArray.Length;

            // Get the request stream.
            _dataStream = request.GetRequestStream();

            // Write the data to the request stream.
            _dataStream.Write(byteArray, 0, byteArray.Length);

            // Close the Stream object.
            _dataStream.Close();

            }
            else
            {
                throw new Exception("Invalid Method Type");
            }
            
        }

خب یکم سخت تر شد!

اینجا اومدیم غیر از شئی request_ که از جنس WebRequest بودش ، یک متغیر به اسم dataStream_ تعریف کردیم که جنسش از نوع Stream هستش و درواقع یک فرستنده هستش ، request_ یک گیرنده بودش ، و datastream_ یک فرستنده هستش در ادامه ما باز هم متد رو تغییر دادیم. در واقع باز هم یک پارامتر دیگه بهش اضافه کردیم به اسم data که جنسش مثل بقیه پارامتر های متد MyWebRequest ، از نوع رشته هستش (String) که کارش ایننه که بگه اونی که هی میگی بگیر بگیر بگیر (POST) اون چی باشه.

حالا میریم سراغ بقیه ککد ها که اضافه کردیم

ما در ابتدا یک رشته تعریف کردیم به اسم postData که مقدارش رو برابر کردیم با پارمتر data و سپس از توع byte (قسمتی از حافظه که جنسش از حافظه هستش و هر هزار بایت میشه یک کیلوبایت و هر هزار کیلو باید میشه یک مگابایت و هر هزار مگابایت میشه یک گیگا بایت و هر هزار گیگابایت میشه یک ترا بایت و همینجور الا آخر) یک آرایه تعریف کردیم که مقادیر رو دریافت کنه . خب جلوش یک علامت مساوی گذاشتیم. اما کدی که جلو مساوی گذاشتیم شاید براتون یکم عجیب باشه ، ما اینجا انکودینگ (شیوه نوشتار و کاراکتر بندی) مقادیر دریافتی رو برابر UTF-8 کردیم که بتونه مقادیر با زبان فارسی هم دریافت کنه ...

حالا در خط بعد ، ما اومدیم و نوع اتصال که فقط اینو بدونید فعلا که اون مقداری که جلوشه ، داره میگه نوع اتصال ، اتصال از یک نرم افزار هستش از طریق وب جهانی (www) .

در خط بعدی ما اومدیم و طول مقادیری که اتصال داره رو از نوع اون آرایه بایتی که قبلا تعریف کرده بودیم قرار دادیم.

خب بعدش ما اومدیم گفتیم که از مقادیر ما استریم بگیره و در انتها POST رو انجام دادیم

 

خب موفق باشید حالا شما به سرورتون که از قبل برنامه نویسیش کردید ، یه درخواست ارسال کردید

ولی هنوز تموم نشده و ما باید اون پاسخ سرور رو دریافت کنیم

پس به متد زیر دقت کنید (توجه این کد ، ادامه کد های قبل است پس من متغیر ها رو نمی نویسم) :

        public string GetResponse()
        {
            // Get the original response.
            WebResponse response = request.GetResponse();

            this.Status = ((HttpWebResponse)response).StatusDescription;

            // Get the stream containing all content returned by the requested server.
            _dataStream = response.GetResponseStream();

            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);

            // Read the content fully up to the end.
            string responseFromServer = reader.ReadToEnd();

            // Clean up the streams.
            reader.Close();
            _dataStream.Close();
            response.Close();

            return responseFromServer;
        }

خب این متد که از جنس String هستش مقادیر رو دریافت می کنه و در انتها مقادیر برگشتی از سرور رو به ما پس میده

دیگه واقعا تموم شد و ما به سرورمون یه درخواست فرستادیم (Request) و یک پاسخ ازش گرفتیم (Response) و این بودش Http Request  در سی شارپ.

 

اما یک نکته کوچولو این وسط باقی می مونه اونم اینه که ، سرور همینجوری نمی تونه بهت اطلاعات بده ، سرور هم باید برنامه نویسی بشه تا بدونه هر درخواستی که بهش دادن چه پاسخی بهشون بده . برنامه نویسی سرور رو بهش میگن سمت سرور که با php , asp.net , node.js , python انجام میشه . شم تا الان که داشتید سی شارپ یاد می گرفتید ، داشتین سمت کلاینت برنامه نویسی می کردید یعنی برای کاربر برنامه نویسی می کردید که اطلاعاتی رو به کاربر بده و ازش بگیره ، ولی سمت سرور برای یک نرم افزار برنامه نویسی میشه که یکسری اطلاعاتی رو از نرم افزار بگیره و بهش بده که انشالله اوناش باشه واسه بعد

کد های این مقاله هم من در یک کلاس نوشتم ، فقط کافیه شما اون کلاس رو وارد پپروژتون کنید و از متدش استفاده کنید که من اون فایل رو ضمیمه این مقاله کردم

فایل های ضمیمه

امير مهدی جبرئيلی

نویسنده 2 مقاله در برنامه نویسان
  • C#.net
  • 761 بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید

نظرات کاربران