Selamlar,
Bugün Rest API işlemlerinde kullanabileceğiniz Refit kütüphanesinin kullanımı ile karşınızdayım.
Refit ?
Refit, Rest API ‘ ler ile hızlı ve kolayca işlemler yapmamızı sağlayan güçlü bir kütüphanedir. Yani HttpClient yerine kullanabileceğimiz alternatif bir kütüphanedir kendileri 🙂 Basit interface tanımları ile hızlıca Get, Post işlemlerini gerçekleştirebiliyorsunuz.
Android tarafında kullanılan Retrofit isimli kütüphaneden esinlendiklerini belirtiyorlar.
Aşağıda bir proje ile basit şekilde nasıl kullanabilirsiniz anlatmaya çalışacağım. Ben örnek için Console Application ile bir proje oluşturdum ve console üzerinden anlatacağım.
Fakat bu bir .Net kütüphanesi olduğu için dolaylı olarak Xamarin ya da mvc, mvc core alt yapısına sahip projelerimizde de bu servisi kullanabilir hale geliyoruz.
Aslında direkt Xamarin ile Refit kullanımı yazısı planlıyordum fakat sonuçta bu bir kütüphane ve işin temelini yazmanın yeterli olacağını düşündüm.
Hazırsanız başlayalım.
1- Öncelikle Nuget Managera gidip arama kısmına Refit yazıp ilgili kütüphanemizi projemize yükleyelim.
Tools > NuGet Package Manager > Manage NuGet Packages for Solitions..
2- Interface classımızı yapalım.
Ben “http://jsonplaceholder.typicode.com/todos” sitesinde ki verileri kullanacağım.
using Refit; using RefitExample.Model; using System.Collections.Generic; using System.Threading.Tasks; namespace RefitExample.Interface { public interface IMyAPI { [Get("/todos")] Task<List<Todos>> GetTodos(); } }
Buraya yakından bakalım. Get kısmında belirttiğimiz /todos Base URL’mizin(http://jsonplaceholder.typicode.com) sonuna otomatik olarak eklenecek olan kısım olmuş oluyor. Yani http://jsonplaceholder.typicode.com/todos olarak istek atmış olacağız. Birazdan daha iyi anlayacağız.
3- Model classımıızı yapalım.
Projede Model adında bir klasör oluşturdum ve bu klsör altında Todos.cs dosyamı oluşturdum.
Model classımızı otomatik olarak yapmak için bu siteden yararlanıyorum. API‘ den dönen verileri kopyalayıp bu siteye yapıştırdığımızda, ilgili model classını oluşturup veriyor. Benim “todos” verime göre modelim aşağıda ki gibi;
using Newtonsoft.Json; namespace RefitExample.Model { public class Todos { [JsonProperty("userId")] public int UserId { get; set; } [JsonProperty("id")] public int Id { get; set; } [JsonProperty("title")] public string Title { get; set; } [JsonProperty("completed")] public bool Completed { get; set; } } }
Interface ve Model classlarımızı yaptık.
4- Apiye istek atan methodumuzu yapalım.
public static async Task<List<Todos>> GetTodosAsync() { List<Todos> todos = new List<Todos>(); var myAPI = RestService.For<IMyAPI>("http://jsonplaceholder.typicode.com"); await myAPI.GetTodos().ContinueWith(ret => { if (ret.IsCompleted == true && ret.Status == TaskStatus.RanToCompletion) { todos = ret.Result; } }); return todos; }Gördüğünüz üzre, sadece base URL’mizi belirttik ve call/request attık. Interface classımız araya girip URL’mizin sonuna /todos ekledi. Bu istek sonucusunu ise todos isimli listeme alıp döndüm. 5- Methodumuzu tetiklemek için Main classımı düzenliyorum.
static async Task Main(string[] args) { var getTodos = await GetTodosAsync(); foreach (var item in getTodos) { Console.WriteLine(item.Id + " - " + item.Title); } Console.ReadKey(); }Evet işlemler bu kadar
Tam kod
using Refit; using RefitExample.Interface; using RefitExample.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace RefitExample { class Program { static async Task Main(string[] args) { var getTodos = await GetTodosAsync(); foreach (var item in getTodos) { Console.WriteLine(item.Id + " - " + item.Title); } Console.ReadKey(); } /// <summary> /// http://jsonplaceholder.typicode.com/todos verilerini döner. /// </summary> /// <returns></returns> public static async Task<List<Todos>> GetTodosAsync() { List<Todos> todos = new List<Todos>(); var myAPI = RestService.For<IMyAPI>("http://jsonplaceholder.typicode.com"); await myAPI.GetTodos().ContinueWith(ret => { if (ret.IsCompleted == true && ret.Status == TaskStatus.RanToCompletion) { todos = ret.Result; } }); return todos; } } }
Ekran çıktısı
Basit şekilde anlatmaya çalıştım umarım yardımcı olabilmişimdir.
Bu projeden bağımsız olarak, aşağıda Header verileri eklmeyi, Post etmeyi Authorization, bearer ile istek nasıl atabilirsiniz ufak kodlar halinde paylaştım.
Header eklemek
Birden fazla Header örneği için, “key:data” şeklinde virgül koyup Headera eklenecek verilerinizi ekleyip gönderebilirsiniz. Ek olarak ?extended=full gibi get parametrelerinide ekleyebilirsiniz.[Headers("Content-Type:application/json", "key:data")] [Get("/todos/{id}?extended=full")] Task<Todos> GetTodos(int id);Çağırmak için:
var getTodos = await GetTodos(id);
Post, Authorization, Bearer İşlemleri
[Headers("Content-Type:application/json", "key:data")] [Post("/todos/posts")] Task<PostModelResult> AddData([Header("Authorization")] string bearerToken, [Body(BodySerializationMethod.Json)] PostModelRequest body);Tetiklemek için;
PostModelResult result = new PostModelResult(); await myAPI.AddData("bearer " + AccessToken, PostModelRequest).ContinueWith(ret => { if (ret.IsCompleted == true && ret.Status == System.Threading.Tasks.TaskStatus.RanToCompletion) { result = ret.Result; } });
Kaynaklar
https://github.com/reactiveui/refit
https://reactiveui.github.io/refit/
Xamarin için yararlı video ve blog;
Video: https://www.youtube.com/watch?v=XQhopjXjSG0
Blog: https://xamgirl.com/consuming-a-restful-web-service-in-xamarin-forms-using-refit-part-1/