![]() |
![]() |
HTTPWebRequest
فراخوانی وب سرویس ها با HTTPWebRequest شامل:
1-ایجاد instance درخواست برای URI خاص
2-تنظیم HTTP property های مختلف برای instance درخواست
3-بازیابی HttpWebResponse از درخواست
4-خواندن داده ها از پاسخ
به عنوان مثال، کد زیر را داده ها را از کتابخانه ملی ایالات متحده در خدمات وب پزشکی بازیابی می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var rxcui = "198440"; var request = HttpWebRequest.Create(string.Format(@"http://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui)); request.ContentType = "application/json"; request.Method = "GET"; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { if (response.StatusCode != HttpStatusCode.OK) Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode); using (StreamReader reader = new StreamReader(response.GetResponseStream())) { var content = reader.ReadToEnd(); if(string.IsNullOrWhiteSpace(content)) { Console.Out.WriteLine("Response contained empty body..."); } else { Console.Out.WriteLine("Response Body: \r\n {0}", content); } Assert.NotNull(content); } } |
کد بالا یک HttpWebRequest که اطلاعات را با فرمت JSON بر می گرداند ایجاد می کند. اطلاعات برگشت داده شده یک HttpWebResponse هستند که از هر StreamReader می توانند برای خواندن اطلاعات دریافت شوند.
RestSharp
رویکرد دیگر برای استفاده از سروریس های REST استفاده از کتابخانه RestSharp است. RestSharp درخواست های HTTP را کپسوله می کند که شامل پشتیبانی از بازیابی نتایجی مانند محتوای رشته ای خام یا آبجکت C# دی سریالایز شده. به عنوان مثال، کد زیر را درخواستی به وب سرویس کتابخانه ملی ایالات متحده پزشکی ایجاد کرده و نتایج را به عنوان یک رشته در قالب JSON بازیابی می کند:
1 2 3 4 5 6 7 8 9 10 11 |
var request = new RestRequest(string.Format("{0}/allinfo", rxcui)); request.RequestFormat = DataFormat.Json; var response = Client.Execute(request); if(string.IsNullOrWhiteSpace(response.Content) || response.StatusCode != System.Net.HttpStatusCode.OK) { return null; } rxTerm = DeserializeRxTerm(response.Content); |
متد DeserializeRxTerm رشته خام JSON را از پراپرتی RestSharp.RestResponse.Content می گیرد و آن را به آبجکت C# کانورت می کند. اطلاعات دی سریالایز شده از وب سرویس هایی که بعدا در مورد آن ها گفته خواهد شد برگردانده می شوند.
NSUrlConnection
علاوه بر کلاس های موجود در کتابخانه کلاس پایه مونو (BCL)، مانند HttpWebRequest، و کتابخانه های C#، مانند RestSharp، کلاس های پلت فرم های خاص نیز برای استفاده در وب سرویس ها در دسترس هستند. برای مثال در iOS، کلاس های NSUrlConnection و NSMutableUrlRequest می توانند استفاده شوند. به عنوان مثال کد زیر چگونگی فراخوانی وب سرویس کتابخانه ملی پزشکی ایالات متحده را با استفاده از کلاس های iOS را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
var rxcui = "198440"; var request = new NSMutableUrlRequest( new NSUrl(string.Format("http://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/{0}/allinfo", rxcui)), NSUrlRequestCachePolicy.ReloadRevalidatingCacheData, 20); request["Accept"] = "application/json"; var connectionDelegate = new RxTermNSURLConnectionDelegate(); var connection = new NSUrlConnection(request, connectionDelegate); connection.Start(); public class RxTermNSURLConnectionDelegate : NSUrlConnectionDelegate { StringBuilder _ResponseBuilder; public bool IsFinishedLoading { get; set; } public string ResponseContent { get; set; } public RxTermNSURLConnectionDelegate() : base() { _ResponseBuilder = new StringBuilder(); } public override void ReceivedData(NSUrlConnection connection, NSData data) { if(data != null) { _ResponseBuilder.Append(data.ToString()); } } public override void FinishedLoading(NSUrlConnection connection) { IsFinishedLoading = true; ResponseContent = _ResponseBuilder.ToString(); } } |
به طور کلی، کلاس های پلت فرم خاص برای استفاده در وب سرویس باید به سناریوهایی که در آن کد native به C# منتقل شده محدود می شوند. در صورت امکان، وب سرویسی که به کد دسترسی دارد باید قابل حمل باشد به طوری که می تواند cross-platform به اشتراک گذاشته شود.