در این آموزش قصد داریم تا نحوه ی ارسال درخواست به یک صفحه وب را در زبان برنامه نویسی سی شارپ آموزش دهیم. اولین چیزی که برای ارسال درخواست به سرور نیاز داریم، روش ارسال یا همان متد(Method) است. در گذشته دو متد GET و POST برای ارسال اطلاعات میان کاربران(Client) و سرورها وجود داشت. بعدها این متدها گسترش پیدا کردند. در حال حاضر پرکاربردترین این متدها شامل انواع زیر هستند:
- Get: برای دریافت اطلاعات از سرور
- Post: برای ارسال اطلاعات به سرور به منظور ایجاد یک رکورد اطلاعاتی(مثلا ثبت نام کاربر جدید، درج یک محصول جدید و…)
- PUT/PATCH: جهت بروز رسانی اطلاعات موجود در سرور(ویرایش اطلاعات کاربری، ویرایش مشخصات یک محصول و…)
- DELETE: برای حذف اطلاعات از سرور(حذف کاربر، حذف محصول، حذف پست و…)
علاوه بر متد، که روش برقراری ارتباط با سرور را تعیین میکند، درخواست ما بخشهای دیگری نیز دارد. دو مورد مهم از اجزای تشکیل دهنده درخواست ما، Header و Body است.
[divider]
Header درخواست HTTP
وظیفه Header اعمال تنظیمات مورد نیاز برای درخواست است. هر درخواست میتواند چندین Header داشته باشد. برخی از مهمترین Header ها عبارتند از:
Content-Type: تعیین کننده ساختار اطلاعات در Body است. یکی از پرکاربردترین انواع آن، مقدار application/json است که به سرور اعلام میدارد که اطلاعات در Body بصورت json قرار گرفته اند. همچنین مقدار application/x-www-form-urlencoded نیز بسیار پرکاربرد است. برای انتقال فایل به سرور نیز، از مقدار multipart/form-data استفاده میشود چرا که فایلها نسبت به درخواستهای دیگر حجیم هستند و اینگونه درخواستها باید به چندین بخش مجزا تبدیل شده و به سرور انتقال پیدا کنند. برای همین از مقدار multipart/form-data استفاده میشود.
- Accept: به سرور میفهماند که پاسخ را در چه ساختاری ارائه کند. مثلا با تعیین مقدار application/json به سرور میفهمانیم که جواب درخواست را در قالب json ارائه کند.
- User-Agent: به کمک این Header میتوانیم به سرور اطلاعاتی در مورد خودمان بدهیم. جالب است بدانید، مرورگرها در هنگام ارسال درخواست نام خود، نسخه فعلی، نام سیستمعامل، نسخه سیستم عامل و ۳۲ بیتی یا ۶۴ بیتی بودن آن را به کمک این Header به سرور ارسال میکنند. این Header تاثیری در درخواست ما ندارد اما به سرور کمک میکند که در مورد Client اطلاعات مفیدی داشته باشد.
- Authorization: معمولا برای درخواستهایی که نیاز به احراز هویت دارند از این Header استفاده میشود.
- Range: اگر درخواست ما برای دانلود فایل باشد،به کمک این Header میتوانیم به سرور بفهمانیم که کدام بخش از فایل را نیاز داریم. در برنامههای دانلود فایل دیدهاید که فایل مورد نظر تکهبندی شده و هر تکه بصورت مجزا دانلود میشود. اساس کار این نرمافزارها همین Header است.
- Referer: به سرور میفهماند که شما از چه سایتی به صفحه کنونی رسیدهاید. این Header برای آمارگیری در سمت سرور استفاده میشود و تاثیری در درخواست ما ندارد.
[divider]
بدنهی درخواست HTTP
بدنه یا Body شامل اطلاعاتی است که ما به صفحه وب مورد نظر ارسال میکنیم. مثلا زمانی که میخواهیم یک کاربر جدید را ثبت نام کنیم، اطلاعاتی مانند نام، نام کاربری، رمزعبور و… را در داخل بدنهی درخواست قرار داده و به سرور ارسال میکنیم. در ادامه یک کلاس در زبان سیشارپ ایجاد میکنیم که به ما کمک میکند درخواستهای خود را به سرور ارسال کنیم.
ارسال درخواست به صفحه وب در سی شارپ
برای اینکار، ابتدا کلاس زیر را به پروژه خود اضافه کنید:
public class MyWebRequest { private WebRequest request; private Stream dataStream; private string status; public String Status { get { return status; } set { status = value; } } public MyWebRequest(string url) { // Create a request using a URL that can receive a post. request = WebRequest.Create(url); } public MyWebRequest(string url, string method) : this(url) { if (method.Equals("GET") || method.Equals("POST")|| method.Equals("PUT")|| method.Equals("PATCH")<code class="csharp plain"></code>|| method.Equals("DELETE")) { // Set the Method property of the request to POST. request.Method = method; } else { throw new Exception("Invalid Method Type"); } } public MyWebRequest(string url, string method, string data) : this(url, method) { // 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(); } 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 data = "username=yusef&password=1234";
کلاسی که کد آن در بالا قرار دارد را به پروژه خود اضافه کنید. در هر کجای پروژهتان که نیاز دارید، یک object از این کلاس ایجاد کنید. در هنگام ایجاد object شما میتوانید آدرس سرور، متد و بدنه درخواست خود را تعیین کنید. سپس به کمک متد GetResponse این کلاس، نتیجه درخواست(جواب برگشتی از وب) را بصورت یک رشته متنی در دسترس خواهید داشت.
توجه داشته باشید که متغیر data فقط زمانی مقداردهی می شود که متد ارسال GET نباشد. زیرا در متد GET داده ها در url و به دنبال آدرس صفحه می آیند. قالب اطلاعات در داخل متغیر data به شکل زیر خواهد بود:
string data = "username=yusef&password=1234";
همانطور که گفتیم کلاسی که به پروژه خود اضافه کردیم، یک متد به نام GetResponse دارد که نتیجه درخواست(جواب برگشتی از وب) را برمی گرداند.
برای استفاده از امکانات این کلاس در پروژه خود، کافیست از نمونه کد زیر استفاده کنید:
//create the constructor with post type and few data string data = "username=yusef&password=1234"; MyWebRequest myRequest = new MyWebRequest("http://www.yoursite.ir","POST",data); //show the response string on the console screen. string Response = myRequest.GetResponse();
موفق و پیروز باشید!
همچنین می توانید نمونه پروژه مربوط به این آموزش را دانلود نمایید:
پسورد فایل: www.myempire.ir
[button color=”red” size=”medium” link=”https://myempire.ir/wp-content/uploads/WebRequestExamplewww.myempire.ir_.zip” target=”blank” ]دریافت نمونه پروژه[/button]
سلام این برنامه از طریق متد POST ارسال داده ها ارسال نمیکنه مشکلش از چیه؟
سلام،
اگر امکان داره بگید که چه خطایی دریافت میکنید.
چه namespace ای باید استفاده کنیم
سلام من با متد POST یک درخواست ارسال میکنم ولی طرف سرور درخواست POST را جواب نمیدهد این مسیله در متد GET پیش نمی آید . فکر کنم متد POST مشکلی دارد .
سلام، با نرمافزار postman درخواستتون رو بفرسید ببینید داخل اون هم به مشکل میخورید یا نه. اگر به مشکل خوردید سرور امکان پاسخ دادن به درخواست post رو نداره. اگر به مشکل نخوردید حتما بخشی از کد رو اشتباه نوشتین!
سلام دوستان وقتی مجدد پست می کنیم صفحه ارور می ده
The state information is invalid for this page and might be corrupted.
سلام
میشه یه توضیحاتی هم بدید.
من یه خورده تو فهم کدها به مشکل خوردم
اطلاعات موجود در این مطلب بروز رسانی شدند. مطالعه مجدد پست به شما کمک میکنه که درک بهتری از ساختار درخواستهای وبی داشته باشید. اگر توضیحات روان و ساده نبود مجدد اعلام کنید تا موضوع سادهتر بیان شود.