فراخوانی Web API با استفاده از HttpClient

جمعه 11 تیر 1395

HttpClient برای ارسال درخواست HTTP ، با استفاده از یک URL استفاده می شود.HttpClient می تواند برای ساخت درخواست های Web API در برنامه Console ، برنامه Winform ، برنامه Web form ، Windows store Applicatio و... استفاده شود.

فراخوانی Web API با استفاده از HttpClient

معرفی:

کلاس HttpClient   یک کلاس پایه را برای ارسال/دریافت  درخواست ها / پاسخ های HTTP از یک URL ، فراهم می کند. این یکی از ویژگی های پشتیبانی از async  در .NET Framework می باشد . HttpClient ، قادر به پردازش چندین درخواست همزمان ، می باشد.این لایه در بالای HttpWebRequest و HttpWebResponse می باشد.همه ی متدهایی که دارای  HttpClient هستند ناهمزمان می باشند.

مثال:

در این مثال ، ما یک برنامه Console داریم.

برای فراخوانی متدهای Web API در برنامه کنسول ، اولین مرحله برای نصب Packageهای مورد نیاز ، از NuGet Package Manager استفاده کنید.Package زیر نیاز است تا در برنامه Console نصب شود.

Package Microsoft.AspNet.WebApi.Client را نصب کنید.

 

مرحله ی بعدی ، ایجاد شی HttpClient می باشد.در قطعه کد زیر ، تابع اصلی متد private static ی به نام "CallWebAPIAsync" را فراخوانی می کند و این بلوک ها تا زمانی که CallWebAPIAsync پردازش را کامل کند ، از تابع wait استفاده می کنند.

1.	static void Main(string[] args)  
2.	{  
3.	    CallWebAPIAsync()  
4.	        .Wait();  
5.	}  
6.	static asyncTaskCallWebAPIAsync()  
7.	{  
8.	    using(var client = newHttpClient())  
9.	    {  
10.	        //Send HTTP requests from here.  
11.	    }  
12.	}  

سپس، ما URL پایه را برای درخواست Http و تنظیم هدرAccept  ، تنظیم  میکنیم.در این مثال ، ما هدر Accept  را به صورت "application/json"  تنظیم کردیم که به سرور بگوید اطلاعات را در فرمت JSON ارسال کند.

1.	using(var client = newHttpClient())  
2.	{  
3.	    client.BaseAddress = newUri("http://localhost:55587/");  
4.	    client.DefaultRequestHeaders.Accept.Clear();  
5.	    client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json"));  
6.	}  

HTTP GET Request:

در کد زیر یک درخواست از نوع Get برای department ارسال می کند ، همانطوری که در زیر نشان داده شده است:

1.	using(var client = newHttpClient())  
2.	{  
3.	    client.BaseAddress = newUri("http://localhost:55587/");  
4.	    client.DefaultRequestHeaders.Accept.Clear();  
5.	    client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json"));  
6.	    //GET Method  
7.	    HttpResponseMessage response = awaitclient.GetAsync("api/Department/1");  
8.	    if (response.IsSuccessStatusCode)  
9.	    {  
10.	        Departmentdepartment = awaitresponse.Content.ReadAsAsync < Department > ();  
11.	        Console.WriteLine("Id:{0}\tName:{1}", department.DepartmentId, department.DepartmentName);  
12.	        Console.WriteLine("No of Employee in Department: {0}", department.Employees.Count);  
13.	    }  
14.	    else  
15.	    {  
16.	        Console.WriteLine("Internal server Error");  
17.	    }  
18.	}  

در کد بالا ، ما از متد GetAsync برای ارسال درخواست Getمربوط به Http به صورت ناهمزمان ،استفاده کرده ایم .زمانی که اجرای این متد به پایان رسید، HttpResponseMessage را برمیگرداند .که شامل پاسخ HTTP می باشد.اگر پاسخ شامل  کد Success باشد ، به این معنا است که بدنه ی پاسخ ، شامل اطلاعات به شکل JSON می باشد.متد ReadAsAsync ، برای deserialize کردن شی JSON استفاده می شود.

زمانی که پاسخ Http شامل یک خطای کدی باشد، HttpClient هیچ خطایی را برنمی گرداند  ، اما IsSuccessStatusCode را false  تنظیم میکند.اگر ما بخواهیم خطای کد Http را به عنوان exceptions تلقی کنیم، ما می توانیم از HttpResponseMessage استفاده کنیم.

زمانی که ما کد بالا را اجرا می گیریم ، exception  "Internal Server error" را میدهد.

ما باید Serializer را برای تشخیص و مدیریت حلقه های خود ارجاع ، پیکربندی کنیم.در کد زیرباید  Global.asax.cs را در Web API قرار دهیم.

1.	GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings  
2.	.PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.All;  

:HTTP POST request

کد زیر برای ارسال یک درخواست Post برای department ، استفاده می شود.

1.	var department = newDepartment() { DepartmentName = "Test Department" };  
2.	HttpResponseMessage response = awaitclient.PostAsJsonAsync("api/Department", department);  
3.	
4.	if (response.IsSuccessStatusCode)  
5.	{  
6.	   // Get the URI of the created resource.  
7.	   UrireturnUrl = response.Headers.Location;  
8.	   Console.WriteLine(returnUrl);  
9.	}  

در این کد ، متد PostAsJsonAsync شی(object) را با فرمت JSON ، Serialize  می کند و این شی JSON را در درخواست POST ارسال می کند. HttpClientیک متد تعبیه شده به نام "PostAsXmlAsync" دارد که  برای ارسال XML در درخواست POST ، ساخته شده است.همچنین ، ما می توانیم از "PostAsync"برای قالب بندی های دیگر استفاده کنیم.

 

HTTP PUT Request:

کد زیر برای ارسال درخواست PUT برای department استفاده  می شود.

1.	//PUT Method  
2.	var department = newDepartment() { DepartmentId = 9, DepartmentName = "Updated Department" };  
3.	HttpResponseMessage response = awaitclient.PutAsJsonAsync("api/Department", department);  
4.	if (response.IsSuccessStatusCode)  
5.	{  
6.	   Console.WriteLine("Success");  
7.	}  

مانند POST ، HttpClient همچنین از این سه متد به نام های : PutAsJsonAsync, PutAsXmlAsync and PutAsync پشتیبانی می کند.

 

HTTP DELETE Request:

کد زیر برای ارسال  یک درخواست DELETE برای department  استفاده می شود.

1.	intdepartmentId = 9;  
2.	HttpResponseMessage response = awaitclient.DeleteAsync("api/Department/" + departmentId);  
3.	if (response.IsSuccessStatusCode)  
4.	{  
5.	   Console.WriteLine("Success");  
6.	}  

 

HttpClient فقط از متد DeleteAsync  پشتیبانی می کند زیرا متد Delete دارای بدنه ی درخواست ، نمی باشد.

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

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