RestSharp ile bir projeden WebAPI’ye bağlanmak

Bu yazımda yazmış olduğunuz WebAPI’ye başka bir uygulamadan nasıl bağlanacağınızı anlatmaya çalışacağım. Bu yazıda WebAPI‘yi yazmaktan çok yazılmış hazır olan bir API’ye bağlantı kuracağız. Bunu yaparken de bağlantı için RestSharp kütüphanesinden , Json serialization-deserialization işlemleri içinde Newton.Json kütüphanesinden yararlanacağız. Bu yüzden ilk olarak Nuget Package Manager’dan RestSharp ve Newton.Json kütüphanelerini indirmelisiniz.

Konuya giriş yapmadan önce kısaca HTTP metotlarından bahsedelim.

HTTP metotları , sunucuya gönderilen request  içinde yapılması istenilen işlem tiplerine ( GET,  POST, PUT, DELETE) verilen genel isimdir. Bu metotlar client’ın  ne yapmak istediğini , ne amaç ile kaynağa bağlanmak istediğini belirtmek için kullanılır.

GET GET metodu, genelde sunucudan bilgi talep edildiğinde kullanılır.
POST POST metodu , genelde sunucu tarafında bilgi gönderileceği durumlarda kullanılır.
PUT PUT metodu , genelde sunucu tarafında bilgi güncelleneceği durumlarda kullanılır. Hangi bilginin güncelleneceğini belirtmek için kaynağın ID’si servis sağlayıcıya gönderilebilir.
DELETE  DELETE metodu, genelde sunucu tarafında bilgi silineceği durumlarda kullanılır. Hangi bilginin silineceğini belirtmek için kaynağın ID’si servis sağlayıcıya gönderilmelidir. ID belirtilmezse tüm kaynakların silinmesi de sağlanabilir. Ancak bu durum dikkatle gerçekleştirilmelidir.

Konu anlatımına geçmeden önce aşağıdaki tüm örnek kodları ve bunları test edebileceğiniz örnek bir .net core web api servisi aşağıdaki github adresime koydum. Tek yapmanız gereken client uygulamasındaki uriyi kendi local servis uriniz ile değiştirip client ve servis uygulamasını aynı anda ayağa kaldırıp debug atmak ve incelemek 🙂

https://github.com/cagataykiziltan/RestsharpApiClient

1. PostMethod

WebAPI projemizde HttpPost olarak etiketlenmiş bir metoda ulaşabilmek için,  PostMethod isimli metodumuzu yazarak başlayalım. 3 adet parametre bizim için yeterli olacaktır.

obj : web api’ye post edeceğimiz nesne
uri :  web apinin ilgili metoduna yönlenecek URL
headers  : opsiyonel olarak belirlenebilen request / response headerları

İlk olarak elimizde bizi hedefe yönlendirecek olan URI ile RestClient sınıfı üzerinden bir client nesnesi oluşturuyoruz. Daha sonra, RestRequest sınıfı ile requestimizi oluşturuyoruz. Requesti oluştururken içerisine POST metodu olduğunu belirtip, request formatımızın Json olacağını ve post edeceğimiz obje için JonSerializeri belirtiyoruz.

Post metodunu jenerik yaparak API’den alacağımız yanıtın hangi modele mapleneceğini belirleyebileceğiz.

Elimizde client nesnemiz , request nesnemiz ve bir de post edeceğimiz ilgili nesnemiz buluduğuna göre bunları birazdan yazacağımız GetResult metoduna yollayıp servise bağlanabiliriz.

public T PostMethod<T>(object obj, string uri, Dictionary<string, string> headers = null)
{
  var client = new RestClient(uri);
  var request = new RestRequest(Method.POST) { RequestFormat = DataFormat.Json};

  var result = GetResult<T>(client, request, obj, headers);
 
  return result;
}

PostMetodu için örnek bir URI oluşturmamız gerekirse aşağıdaki formatta bir uri oluşturabilirsiniz.

 var uri = string.Format("{0}/{1}", "http://localhost:5000/api", "v1/PostMethodRouteName"); 

GetResult metodu clientımızı, requestimizi varsa request ile beraber göndereceğimiz nesnemizi ve headerımızı alıp gerekli bağlantıyı sağlayıp bize sonucu dönen metot olacaktır. Farkettiyseniz elimizde bir client nesnesi , bir request nesnesi, servise gidecek nesne ve headerlar var ancak bunların hepsi birbirinden ayrı vaziyette. Şimdi GetResult metodunda bunları bir araya getirelim.

Önce kafamızda mantığı kuralım. Bir clientımız ve bir requestimiz var. Requestimizi client üzerinden ilgili servise göndermeliyiz. Bu durumda servise gidecek nesnemiz ve headerımız da bu requestin içinde gitmeli. O zaman bunu kodlayalım

private T GetResult<T>(RestClient client, RestRequest request, object obj = null, Dictionary<string, string> headers = null)
{     
     if(headers != null) //header varsa requeste headerları ekle
     {
       foreach (var header in headers)
       {
         request.AddHeader(header.Key, header.Value);
       }
     }

      if (obj != null) //post,put,delete gibi işlemler için servise gönderilecek nesne varsa requeste ekle
      {
       request.AddJsonBody(obj);
      }
       //client üzerinden requesti servise yolla ve
       var response = client.Execute(request);
      
    return JsonConvert.DeserializeObject<T>(response.Content, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

}

Web api , siz başka bir yol belirtmediğiniz sürece resultlarını JSON olarak döner ve requestlerini JSON olarak alır. Yukarıda da  Newtonsoft.Json kütüphanesi ile servisten aldığımız JSON olarak serilaze edilmiş yanıtı tekrar deserialize ediyoruz.

2. GetMethod

Aşağıda web api projemizdeki bir get metoduna request atmak için gerekli metot var. Dikkat ettiyseniz formatı Post metoduna çok benzer. Yine elimizdeki uri ile bir RestClient oluşturuyoruz. Daha sonra RestRequest classı ile bir GET request’i oluşturuyoruz. Burada yukarıdaki gibi post ile api’ye bir request göndermeyeceğimiz için serilaziation ayarlamaları yapmamıza da gerek kalmıyor.

Son olarak da oluşturduğumuz client’ı ve requesti yukarıda yazdığımız GetResult metoduna gönderiyoruz. Request nesnemiz ve header’ımız olmadığından null olarak gönderilebilirler.

 public T GetMethod<T>(string uri, Dictionary<string, string> headers = null)
 {
    var client = new RestClient(uri);
    var request = new RestRequest(Method.GET) { RequestFormat = DataFormat.Json };
       
    var result = GetResult<T>(client, request, null, headers);
      
    return result;
 }

Get metodu için uri oluşturmak post metoduna göre biraz farklıdır. Servis tarafından bilgi almak için get metodunu kullanırken bu bilginin unique belirleyicilerini servise göndermemiz gerekebilir. Bunu da Uri üzerinden aşağıdaki şekilde yaparız.

var uri = string.Format("http://{0}/{1}?Id={2}&PersonalId={3}" , "http://localhost:5000/api", "v1/GetMethodRouteName", request.Id, request.PersonalId);

3. PutMethod

Sırada Put metodumuz var. Artık request metotlarımızın aynı yapıda gittiğini ve çok da basit olduğunu farketmişsinizdir. Put sunucu tarafında bir veri güncelleneceği zaman kullanılır ve güncellenecek veriyi belirlemek için veriyi belirtecek bir değer(Id gibi) server tarafında gönderilir. Yine aynı şekilde bir client, ardından bir request ve argumanları GetResult metoduna yollamak, işlem bu kadar…

public T PutMethod<T>(object obj, string uri, Dictionary<string, string> headers = null)
{
    var client = new RestClient(uri);
    var request = new RestRequest(Method.PUT) { RequestFormat = DataFormat.Json };
    var result = GetResult<T>(client, request, obj, headers);

   return result;
}

Put metodu için uri oluşturmak da post metoduyla aynı şekildedir.

 var uri = string.Format("http://{0}/{1}", "localhost:5000/api", "v1/PutMethodRouteName");

4. DeleteMethod
Delete sunucu tarafında bir veri silineceği zaman kullanılır ve silinecek veriyi belirlemek için veriyi belirtecek bir değer(Id gibi) server tarafında gönderebilir.

 public T DeleteMethod<T>(string uri, Dictionary<string, string> headers = null)
 {
   var client = new RestClient(uri);
   var request = new RestRequest(Method.DELETE) { RequestFormat = DataFormat.Json };
   var result = GetResult<T>(client, request, null, headers);

   return result;
 }
 var uri= string.Format("{0}/{1}?id={2}", uri, "DeleteMethodRouteName", 3);

You may also like...

1 Response

  1. mehmet dedi ki:

    Bir sorum olacak Çağatay bey,

    //client üzerinden requesti servise yolla ve
    var response = client.Execute(request);
    ile aldığımız response.content içeriği […..] içinde geliyor . Bunları ayıklayınca normal Json formatını elde ediyoruz. belki component sürüm farklılığından diye düşündüm ama diğer örneklerde de hiç bu temizleme işini yapanı görmedim. Benim yanlışım nerde? response.Content içeriği aşağıdaki gibi:

    [{“KRN”:2667269100005,”GAD”:”2667269100005 – BALIKLI (Eczane)”,”DRM”:”AKTIF”,”MRS”:null,”VRG”:”36829099444″,”CKY”:null}]

    Teşekkür ederim

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir