Shelf API
- Dart kursu
- İleri seviye
- Ders 80/83
- 6 dk
Shelf ile REST API iskeletini kurarsın.
Shelf HTTP sunucusu
shelf, Dart için hafif HTTP sunucu paketidir. import 'package:shelf/shelf.dart'; ile içe aktarılır. Handler bir fonksiyon türüdür: Request alır, Response döndürür. shelf_router paketi yol (route) eşleştirme ekler.
Bir işleyici yazmak: Response taskHandler(Request req, TaskService svc) { return Response.ok('...'); }. Response.ok(body) 200 durum koduyla yanıt döndürür. İşleyici bir TaskService alır; böylece servis değiştirilebilir. Shelf, büyük bir framework olmadan REST API kurmaya olanak tanır; sadece işleyici zinciri yeterlidir.
taskHandler fonksiyonu
taskHandler, bir HTTP isteğini alan ve görev listesini yanıtlayan fonksiyondur. Request req ile gelen isteği, TaskService svc ile hızmeti alır. svc.list().length ile görev sayısını bulur.
Örnek: Response taskHandler(Request req, TaskService svc) { return Response.ok('görevler: ${svc.list().length}'); }. Burada svc dışarıdan enjekte edilir; işleyici hangi servisi kullandığını bilmez. Bu, test edilebilirliği artırır: testte sahte servis, üretimde gerçek servis verilir. Shelf'in Router sınıfıyla işleyici bir yola bağlanır ve sunucu başlatılır.
Uygulama taskHandler fonksiyonu
import 'package:shelf/shelf.dart'; ve import 'package:shelf_router/shelf_router.dart'; satırlarını en üste ekle. Response taskHandler(Request req, TaskService svc) fonksiyonunu yaz; içinde return Response.ok('görevler: ${svc.list().length}'); yap. main içine final svc = InMemoryTaskService(); ve print('Shelf: ${svc.list().length} görev') ekle.
Başlangıç kodu
class Task {
final int id;
final String title;
Task({required this.id, required this.title});
}
abstract class TaskService {
List<Task> list();
}
class InMemoryTaskService implements TaskService {
@override
List<Task> list() => [Task(id: 1, title: 'görev 1')];
}
// shelf ve shelf_router paketlerini içe aktar
// taskHandler fonksiyonunu yaz (Request ve TaskService al, Response dön)
void main() {
// Shelf bilgisini yazdır
}Örnek çözüm
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
class Task {
final int id;
final String title;
Task({required this.id, required this.title});
}
abstract class TaskService {
List<Task> list();
}
class InMemoryTaskService implements TaskService {
@override
List<Task> list() => [Task(id: 1, title: 'görev 1')];
}
Response taskHandler(Request req, TaskService svc) {
return Response.ok('görevler: ${svc.list().length}');
}
void main() {
final svc = InMemoryTaskService();
print('Shelf: ${svc.list().length} görev');
}Beklenen çıktı
Shelf: 1 görev
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 shelf paket içe aktarımı
import 'package:____/shelf.dart';
import 'package:shelf/shelf.dart';
Açıklama: shelf paketi package:shelf/shelf.dart ile içe aktarılır.
2 Response.ok ne yapar?
- Veritabanı açar
- Hata fırlatır
- Dosya siler
- 200 yanıtı döndürür Doğru cevap
Açıklama: Response.ok 200 durum koduyla yanıt döndürür.
3 Shelf parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
shelf |
HTTP sunucu |
Response |
Yanıt |
Request |
İstek |
taskHandler |
İşleyici |