Sitemap

Flutter’da Retrofit İle Anlaşılır Rest Api Sorguları Oluşturma

4 min readJun 23, 2025

--

Merhaba, değerli geliştirici arkadaşlar bu yazımda Flutter tarafında Retrofit ile temiz ve anlaşılır rest api sorguları oluşturmayı öğreneceğiz. Lafı uzatmadan adım adım konumuza giriş yapalım.

Öncelikle neden anlaşılır ve temiz sorgulara ihtiyacımız olduğunu anlayalım.

Bildiğiniz gibi Flutter tarafında api istekleri yaparken en sık kullanılan paket http paketidir. Http paketi ile apilere istek atıp gelen verileri ekranda gösterebiliyoruz. Ancak Http paketinin eksik ve yetersiz kaldığı noktalar var;

  • URL’leri elle birleştirmek.
  • Header'ları (başlıkları) her istek için tekrar tekrar ayarlamak.
  • Gelen JSON verisini elle Map<String, dynamic>'e dönüştürmek.
  • Bu Map'i de elle kendi Dart model sınıflarımıza (User, Product vb.) dönüştürmek.
  • Hata yönetimini manuel olarak yapmak.

Http paketinin bu eksikliklerine karşın Flutter için Native Android tarafından özenilen bir Retrofit geliştirilmiştir

Retrofit Nedir

Retrofit, Android dünyasından ilham alınarak Flutter için geliştirilmiş bir kod üretme (code generation) kütüphanesidir. Temel amacı, ağ isteklerinizi son derece basit, okunabilir ve hataya karşı güvenli bir şekilde yapmanızı sağlamaktır.

Retrofit, sizin yazdığınız soyut bir Dart sınıfını (abstract class) analiz eder ve arka planda bu sınıfı hayata geçiren, tüm karmaşık ağ işlemlerini yapan somut bir kod otomatik olarak üretir.

Ana Fikir Şudur: Siz sadece nasıl bir istek yapmak istediğinizi (hangi URL, hangi metot, hangi parametreler) deklaratif (bildirimsel) bir şekilde tanımlarsınız, Retrofit ise bu isteği nasıl yapacağını kendisi halleder.

Retrofitin bize sunduğu avantajlar;

  • Tip-Güvenliği (Type-Safety): Bu en önemli özelliğidir. Retrofit, gelen JSON verisini otomatik olarak sizin belirlediğiniz Dart model sınıflarına (User, Product vb.) dönüştürür. Map’lerle veya dynamic tiplerle uğraşmak zorunda kalmazsınız. Bu, çalışma zamanında (runtime) oluşabilecek “tip uyuşmazlığı” hatalarını derleme zamanında (compile-time) yakalamanızı sağlar.
  • Okunabilirlik ve Temiz Kod: Ağ istekleriniz, sadece metot çağrılarından ibaret hale gelir. Karmaşık http.post(…) blokları yerine apiService.createUser(newUser) gibi son derece temiz bir kod yazarsınız.
  • Kod Üretimi (Code Generation): Tüm angarya işleri sizin yerinize yapar. JSON serileştirme/deserileştirme (genellikle json_serializable ile birlikte kullanılır), URL oluşturma, header ekleme gibi işlemleri otomatik olarak üretilen koda dahil eder. Sizin bu detaylarla uğraşmanıza gerek kalmaz.
  • Esneklik: URL’nin dinamik kısımlarını (@Path), sorgu parametrelerini (@Query), istek gövdesini (@Body), form verilerini (@Field) ve header’ları (@Header) eklemek için basit anotasyonlar ( @ ) sunar.
  • Hata Yönetimi: HTTP hata kodlarını ve ağ hatalarını daha kolay yönetmenizi sağlayan yapılar sunar.

Retrofitin bize sunduğu avantajları daha iyi anlamanız için before/after tadında iki kod bloğu paylaşıyorum.

Retrofit kullanılmadan

Future<User> createUser(User user) async {
final response = await http.post(
Uri.parse('https://api.example.com/users'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(user.toJson()),
);
if (response.statusCode == 201) {
return User.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to create user.');
}
}

Retrofit kullanılarak

@POST('/users')
Future<User> createUser(@Body() User user);

Ben bir şey söylemiyorum görüyorsunuz zaten şırıl şırıl…

Retrofit Kullanımı

Retrofit genellikle 4 ana paketle birlikte çalışır:

  1. retrofit: Temel anotasyonları ve çalışma zamanı bileşenlerini içerir.
  2. retrofit_generator: Arka planda kodu üreten asıl işi yapan pakettir. Sadece dev_dependencies’e eklenir.
  3. dio: Retrofit, ağ isteklerini yapmak için altta http yerine genellikle daha güçlü ve esnek olan dio paketini kullanır.
  4. json_serializable ve build_runner: Model sınıflarınızın (User gibi) JSON’a ve JSON’dan dönüştürülmesi için gerekli toJson() ve fromJson() metotlarını otomatik üretmek için kullanılır.

Bu paketleri projenize eklediğinizi varsayarak diğer adımlara geçiyorum.

a) Model Sınıfını Oluştur: API’den gelecek veriyi temsil eden bir Dart sınıfı (User.dart gibi) oluşturursun. Bu sınıfı json_serializable ile işaretlersin.

// user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';

@JsonSerializable()
class User {
int id;
String name;
String email;

User({required this.id, required this.name, required this.email});

factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}

b) Api Servisini Oluştur: Hangi istekleri yapacağını belirten soyut bir sınıf (api_service.dart) oluşturursun. Bu, Retrofit’in kalbidir.

// api_service.dart
import 'package:dio/dio.dart';
import 'package:retrofit/retrofit.dart';
import 'user.dart';
part 'api_service.g.dart';

@RestApi(baseUrl: "https://jsonplaceholder.typicode.com")
abstract class ApiService {
factory ApiService(Dio dio, {String baseUrl}) = _ApiService;

@GET("/users")
Future<List<User>> getUsers();

@GET("/users/{id}")
Future<User> getUserDetail(@Path("id") int userId);

@POST("/users")
Future<User> createUser(@Body() User user);
}

c) Kod Üretimi: Buraya kadar hazırladıysanız aşağıdaki kodu terminale yazıp çalıştırmanız gerekiyor. Bu kod çalıştığında user.g.dart (JSON dönüşümleri için) ve api_service.g.dart (ağ isteklerini yapan asıl kod) dosyalarını otomatik olarak oluşturur.

flutter pub run build_runner build --delete-conflicting-outputs

Bu işlemden sonra ilgili yapınızı uygulamanızda kullanabilirsiniz.

void fetchUsers() async {
final dio = Dio();
final apiService = ApiService(dio);

try {
List<User> users = await apiService.getUsers();
for (var user in users) {
print(user.name); // Doğrudan 'name' özelliğine erişiyoruz! Map yok!
}
} catch (e) {
print(e);
}
}

Makale içerikleri çok uzun olunca okuyucu sıkılabildiği için bu yazımda çok fazla detaya girip uzatmak istemedim. Yinede aklınıza takılan noktalar olursa yorumlar kısmından belirtebilirsiniz.

Değerli arkadaşlar bu yazımda Flutter’da Retrofit kullanımını ve Retrofit ile daha anlaşılır rest api istekleri yapmayı anlatmaya çalıştım. Umarım ilgilisi ve meraklısı için faydalı bir yazı olmuştur.

Github: www.github.com/abdullah017
Linkedin: www.linkedin.com/in/abdullahtas
Stackoverflow:
https://stackoverflow.com/users/13807726/abdullah-t

--

--

AbdullahTaş
AbdullahTaş

Written by AbdullahTaş

FLUTTER DEVELOPER AT IWWOMI | HASURA-GRAPHQL & FIREBASE |

No responses yet