Networking
Giriş
Nylo Website ağ işlemlerini basit hale getirir. API uç noktalarını NyApiService'i genişleten servis sınıflarında tanımlarsınız, ardından bunları sayfalarınızdan çağırırsınız. Framework, JSON çözümleme, hata yönetimi, önbellekleme ve yanıtların model sınıflarınıza otomatik dönüştürülmesini ("morphing" olarak adlandırılır) yönetir.
API servisleriniz lib/app/networking/ dizininde bulunur. Yeni bir proje varsayılan bir ApiService içerir:
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext})
: super(
buildContext,
decoders: modelDecoders,
);
@override
String get baseUrl => getEnv('API_BASE_URL');
@override
Map<Type, Interceptor> get interceptors => {
...super.interceptors,
};
Future fetchUsers() async {
return await network(
request: (request) => request.get("/users"),
);
}
}
HTTP istekleri yapmanın üç yolu vardır:
| Yaklaşım | Döndürür | En İyi Kullanım |
|---|---|---|
Kısa yol metotları (get, post, vb.) |
T? |
Basit CRUD işlemleri |
network() |
T? |
Önbellekleme, yeniden deneme veya özel başlıklar gerektiren istekler |
networkResponse() |
NyResponse<T> |
Durum kodları, başlıklar veya hata ayrıntılarına ihtiyaç duyduğunuzda |
Arka planda, Nylo Website güçlü bir HTTP istemcisi olan Dio'yu kullanır.
Kısa Yol Metotları
NyApiService, yaygın HTTP işlemleri için kısa yol metotları sağlar. Bunlar dahili olarak network()'ü çağırır.
GET İsteği
Future<User?> fetchUser(int id) async {
return await get<User>(
"/users/$id",
queryParameters: {"include": "profile"},
);
}
POST İsteği
Future<User?> createUser(Map<String, dynamic> data) async {
return await post<User>("/users", data: data);
}
PUT İsteği
Future<User?> updateUser(int id, Map<String, dynamic> data) async {
return await put<User>("/users/$id", data: data);
}
DELETE İsteği
Future<bool?> deleteUser(int id) async {
return await delete<bool>("/users/$id");
}
PATCH İsteği
Future<User?> patchUser(int id, Map<String, dynamic> data) async {
return await patch<User>("/users/$id", data: data);
}
HEAD İsteği
Kaynak varlığını kontrol etmek veya gövdeyi indirmeden başlıkları almak için HEAD kullanın:
Future<bool> checkResourceExists(String url) async {
Response response = await head(url);
return response.statusCode == 200;
}
Network Yardımcısı
network metodu, kısa yol metotlarından daha fazla kontrol sağlar. Dönüştürülmüş veriyi (T?) doğrudan döndürür.
class ApiService extends NyApiService {
...
Future<User?> fetchUser(int id) async {
return await network<User>(
request: (request) => request.get("/users/$id"),
);
}
Future<List<User>?> fetchUsers() async {
return await network<List<User>>(
request: (request) => request.get("/users"),
);
}
Future<User?> createUser(Map<String, dynamic> data) async {
return await network<User>(
request: (request) => request.post("/users", data: data),
);
}
}
request callback'i, temel URL'niz ve interceptor'larınız önceden yapılandırılmış bir Dio örneği alır.
network Parametreleri
| Parametre | Tür | Açıklama |
|---|---|---|
request |
Function(Dio) |
Gerçekleştirilecek HTTP isteği (zorunlu) |
bearerToken |
String? |
Bu istek için Bearer token |
baseUrl |
String? |
Servis temel URL'sini geçersiz kıl |
headers |
Map<String, dynamic>? |
Ek başlıklar |
retry |
int? |
Yeniden deneme sayısı |
retryDelay |
Duration? |
Yeniden denemeler arası gecikme |
retryIf |
bool Function(DioException)? |
Yeniden deneme koşulu |
connectionTimeout |
Duration? |
Bağlantı zaman aşımı |
receiveTimeout |
Duration? |
Alma zaman aşımı |
sendTimeout |
Duration? |
Gönderme zaman aşımı |
cacheKey |
String? |
Önbellek anahtarı |
cacheDuration |
Duration? |
Önbellek süresi |
cachePolicy |
CachePolicy? |
Önbellek stratejisi |
checkConnectivity |
bool? |
İstekten önce bağlantıyı kontrol et |
handleSuccess |
Function(NyResponse<T>)? |
Başarı callback'i |
handleFailure |
Function(NyResponse<T>)? |
Hata callback'i |
networkResponse Yardımcısı
Tam yanıta -- durum kodları, başlıklar, hata mesajları -- erişmeniz gerektiğinde networkResponse kullanın; yalnızca veriye değil. T? yerine NyResponse<T> döndürür.
networkResponse'u şu durumlarda kullanın:
- Belirli bir işleme için HTTP durum kodlarını kontrol etmeniz gerektiğinde
- Yanıt başlıklarına erişmeniz gerektiğinde
- Kullanıcı geri bildirimi için ayrıntılı hata mesajları almanız gerektiğinde
- Özel hata yönetimi mantığı uygulamanız gerektiğinde
Future<NyResponse<User>> fetchUser(int id) async {
return await networkResponse<User>(
request: (request) => request.get("/users/$id"),
);
}
Ardından yanıtı sayfanızda kullanın:
NyResponse<User> response = await _apiService.fetchUser(1);
if (response.isSuccessful) {
User? user = response.data;
print('Status: ${response.statusCode}');
} else {
print('Error: ${response.errorMessage}');
print('Status: ${response.statusCode}');
}
network ile networkResponse Karşılaştırması
// network() — returns the data directly
User? user = await network<User>(
request: (request) => request.get("/users/1"),
);
// networkResponse() — returns the full response
NyResponse<User> response = await networkResponse<User>(
request: (request) => request.get("/users/1"),
);
User? user = response.data;
int? status = response.statusCode;
Her iki metot da aynı parametreleri kabul eder. Yanıtı verinin ötesinde incelemeniz gerektiğinde networkResponse'u seçin.
NyResponse
NyResponse<T>, Dio yanıtını dönüştürülmüş veri ve durum yardımcılarıyla sarar.
Özellikler
| Özellik | Tür | Açıklama |
|---|---|---|
response |
Response? |
Orijinal Dio Response |
data |
T? |
Dönüştürülmüş/çözümlenmiş veri |
rawData |
dynamic |
Ham yanıt verisi |
headers |
Headers? |
Yanıt başlıkları |
statusCode |
int? |
HTTP durum kodu |
statusMessage |
String? |
HTTP durum mesajı |
contentType |
String? |
Başlıklardan içerik türü |
errorMessage |
String? |
Çıkarılan hata mesajı |
Durum Kontrolleri
| Getter | Açıklama |
|---|---|
isSuccessful |
Durum 200-299 |
isClientError |
Durum 400-499 |
isServerError |
Durum 500-599 |
isRedirect |
Durum 300-399 |
hasData |
Veri null değil |
isUnauthorized |
Durum 401 |
isForbidden |
Durum 403 |
isNotFound |
Durum 404 |
isTimeout |
Durum 408 |
isConflict |
Durum 409 |
isRateLimited |
Durum 429 |
Veri Yardımcıları
NyResponse<User> response = await apiService.fetchUser(1);
// Get data or throw if null
User user = response.dataOrThrow('User not found');
// Get data or use a fallback
User user = response.dataOr(User.guest());
// Run callback only if successful
String? greeting = response.ifSuccessful((user) => 'Hello ${user.name}');
// Pattern match on success/failure
String result = response.when(
success: (user) => 'Welcome, ${user.name}!',
failure: (response) => 'Error: ${response.statusMessage}',
);
// Get a specific header
String? authHeader = response.getHeader('Authorization');
Temel Seçenekler
API servisiniz için varsayılan Dio seçeneklerini baseOptions parametresini kullanarak yapılandırın:
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(
buildContext,
decoders: modelDecoders,
baseOptions: (BaseOptions baseOptions) {
return baseOptions
..connectTimeout = Duration(seconds: 5)
..sendTimeout = Duration(seconds: 5)
..receiveTimeout = Duration(seconds: 5);
},
);
...
}
Seçenekleri bir örnek üzerinde dinamik olarak da yapılandırabilirsiniz:
apiService.setConnectTimeout(Duration(seconds: 10));
apiService.setReceiveTimeout(Duration(seconds: 30));
apiService.setSendTimeout(Duration(seconds: 10));
apiService.setContentType('application/json');
Ayarlayabileceğiniz tüm temel seçenekleri görmek için buraya tıklayın.
Başlık Ekleme
İstek Başına Başlıklar
Future fetchWithHeaders() async => await network(
request: (request) => request.get("/test"),
headers: {
"Authorization": "Bearer aToken123",
"Device": "iPhone"
}
);
Bearer Token
Future fetchUser() async => await network(
request: (request) => request.get("/user"),
bearerToken: "hello-world-123",
);
Servis Düzeyinde Başlıklar
apiService.setHeaders({"X-Custom-Header": "value"});
apiService.setBearerToken("my-token");
RequestHeaders Uzantısı
RequestHeaders türü (bir Map<String, dynamic> typedef'i) yardımcı metotlar sağlar:
@override
Future<RequestHeaders> setAuthHeaders(RequestHeaders headers) async {
String? token = Auth.data(field: 'token');
if (token != null) {
headers.addBearerToken(token);
}
headers.addHeader('X-App-Version', '1.0.0');
return headers;
}
| Metot | Açıklama |
|---|---|
addBearerToken(token) |
Authorization: Bearer başlığını ayarla |
getBearerToken() |
Başlıklardan bearer token'ı oku |
addHeader(key, value) |
Özel bir başlık ekle |
hasHeader(key) |
Bir başlığın var olup olmadığını kontrol et |
Dosya Yükleme
Tekli Dosya Yükleme
Future<UploadResponse?> uploadAvatar(String filePath) async {
return await upload<UploadResponse>(
'/upload',
filePath: filePath,
fieldName: 'avatar',
additionalFields: {'userId': '123'},
onProgress: (sent, total) {
double progress = sent / total * 100;
print('Progress: ${progress.toStringAsFixed(0)}%');
},
);
}
Çoklu Dosya Yükleme
Future<UploadResponse?> uploadDocuments() async {
return await uploadMultiple<UploadResponse>(
'/upload',
files: {
'avatar': '/path/to/avatar.jpg',
'document': '/path/to/doc.pdf',
},
additionalFields: {'userId': '123'},
onProgress: (sent, total) {
print('Progress: ${(sent / total * 100).toStringAsFixed(0)}%');
},
);
}
Dosya İndirme
Future<void> downloadFile(String url, String savePath) async {
await download(
url,
savePath: savePath,
onProgress: (received, total) {
if (total != -1) {
print('Progress: ${(received / total * 100).toStringAsFixed(0)}%');
}
},
deleteOnError: true,
);
}
Interceptor'lar
Interceptor'lar, istekleri gönderilmeden önce değiştirmenize, yanıtları yönetmenize ve hataları ele almanıza olanak tanır. API servisi üzerinden yapılan her istekte çalışırlar.
Interceptor'ları şu durumlarda kullanın:
- Tüm isteklere kimlik doğrulama başlıkları eklemeniz gerektiğinde
- Hata ayıklama için istek ve yanıtları günlüğe kaydetmeniz gerektiğinde
- İstek/yanıt verilerini global olarak dönüştürmeniz gerektiğinde
- Belirli hata kodlarını ele almanız gerektiğinde (örn. 401'de token yenileme)
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(buildContext, decoders: modelDecoders);
@override
Map<Type, Interceptor> get interceptors => {
...super.interceptors,
BearerAuthInterceptor: BearerAuthInterceptor(),
LoggingInterceptor: LoggingInterceptor(),
};
...
}
Özel Interceptor Oluşturma
metro make:interceptor logging
Dosya: app/networking/dio/interceptors/logging_interceptor.dart
import 'package:nylo_framework/nylo_framework.dart';
class LoggingInterceptor extends Interceptor {
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
print('REQUEST[${options.method}] => PATH: ${options.path}');
return super.onRequest(options, handler);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
print('RESPONSE[${response.statusCode}] => PATH: ${response.requestOptions.path}');
handler.next(response);
}
@override
void onError(DioException dioException, ErrorInterceptorHandler handler) {
print('ERROR[${dioException.response?.statusCode}] => PATH: ${dioException.requestOptions.path}');
handler.next(dioException);
}
}
Ağ Günlükçüsü
Nylo Website, yerleşik bir NetworkLogger interceptor'u içerir. Ortamınızda APP_DEBUG true olduğunda varsayılan olarak etkindir.
Yapılandırma
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(
buildContext,
decoders: modelDecoders,
useNetworkLogger: true,
networkLogger: NetworkLogger(
logLevel: LogLevelType.verbose,
request: true,
requestHeader: true,
requestBody: true,
responseBody: true,
responseHeader: false,
error: true,
),
);
}
useNetworkLogger: false ayarlayarak devre dışı bırakabilirsiniz.
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext})
: super(
buildContext,
decoders: modelDecoders,
useNetworkLogger: false, // <-- Günlükçüyü devre dışı bırak
);
Günlük Seviyeleri
| Seviye | Açıklama |
|---|---|
LogLevelType.verbose |
Tüm istek/yanıt ayrıntılarını yazdır |
LogLevelType.minimal |
Yalnızca metot, URL, durum ve süreyi yazdır |
LogLevelType.none |
Günlük çıktısı yok |
Günlükleri Filtreleme
NetworkLogger(
filter: (options, args) {
// Only log requests to specific endpoints
return options.path.contains('/api/v1');
},
)
API Servisi Kullanma
API servisinizi bir sayfadan çağırmanın iki yolu vardır.
Doğrudan Örnekleme
class _MyHomePageState extends NyPage<MyHomePage> {
ApiService _apiService = ApiService();
@override
get init => () async {
List<User>? users = await _apiService.fetchUsers();
print(users);
};
}
api() Yardımcısını Kullanma
api yardımcısı, config/decoders.dart'taki apiDecoders'ınızı kullanarak örnekler oluşturur:
class _MyHomePageState extends NyPage<MyHomePage> {
@override
get init => () async {
User? user = await api<ApiService>((request) => request.fetchUser());
print(user);
};
}
Callback'lerle birlikte:
await api<ApiService>(
(request) => request.fetchUser(),
onSuccess: (response, data) {
// data is the morphed User? instance
},
onError: (DioException dioException) {
// Handle the error
},
);
api() Yardımcısı Parametreleri
| Parametre | Tür | Açıklama |
|---|---|---|
request |
Function(T) |
API istek fonksiyonu |
context |
BuildContext? |
Build bağlamı |
headers |
Map<String, dynamic> |
Ek başlıklar |
bearerToken |
String? |
Bearer token |
baseUrl |
String? |
Temel URL'yi geçersiz kıl |
page |
int? |
Sayfalandırma sayfası |
perPage |
int? |
Sayfa başına öğe |
retry |
int |
Yeniden deneme sayısı |
retryDelay |
Duration? |
Yeniden denemeler arası gecikme |
onSuccess |
Function(Response, dynamic)? |
Başarı callback'i |
onError |
Function(DioException)? |
Hata callback'i |
cacheKey |
String? |
Önbellek anahtarı |
cacheDuration |
Duration? |
Önbellek süresi |
API Servisi Oluşturma
Yeni bir API servisi oluşturmak için:
metro make:api_service user
Model ile birlikte:
metro make:api_service user --model="User"
Bu, CRUD metotlarına sahip bir API servisi oluşturur:
class UserApiService extends NyApiService {
...
Future<List<User>?> fetchAll({dynamic query}) async {
return await network<List<User>>(
request: (request) => request.get("/endpoint-path", queryParameters: query),
);
}
Future<User?> find({required int id}) async {
return await network<User>(
request: (request) => request.get("/endpoint-path/$id"),
);
}
Future<User?> create({required dynamic data}) async {
return await network<User>(
request: (request) => request.post("/endpoint-path", data: data),
);
}
Future<User?> update({dynamic query}) async {
return await network<User>(
request: (request) => request.put("/endpoint-path", queryParameters: query),
);
}
Future<bool?> delete({required int id}) async {
return await network<bool>(
request: (request) => request.delete("/endpoint-path/$id"),
);
}
}
JSON'u Modellere Dönüştürme
"Morphing", Nylo Website'in JSON yanıtlarını Dart model sınıflarınıza otomatik olarak dönüştürmesi için kullandığı terimdir. network<User>(...) kullandığınızda, yanıt JSON'u bir User örneği oluşturmak için decoder'ınızdan geçirilir -- manuel ayrıştırma gerekmez.
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(buildContext, decoders: modelDecoders);
// Returns a single User
Future<User?> fetchUser() async {
return await network<User>(
request: (request) => request.get("/user/1"),
);
}
// Returns a List of Users
Future<List<User>?> fetchUsers() async {
return await network<List<User>>(
request: (request) => request.get("/users"),
);
}
}
Decoder'lar lib/bootstrap/decoders.dart dosyasında tanımlanır:
final Map<Type, dynamic> modelDecoders = {
User: (data) => User.fromJson(data),
List<User>: (data) =>
List.from(data).map((json) => User.fromJson(json)).toList(),
};
network<T>()'ye geçtiğiniz tür parametresi, doğru decoder'ı bulmak için modelDecoders haritanızla eşleştirilir.
Ayrıca bakınız: Decoders model decoder'larını kaydetme hakkında ayrıntılar için.
Yanıtları Önbellekleme
API çağrılarını azaltmak ve performansı artırmak için yanıtları önbelleğe alın. Önbellekleme, ülke listeleri, kategoriler veya yapılandırma gibi sık değişmeyen veriler için kullanışlıdır.
Bir cacheKey ve isteğe bağlı cacheDuration sağlayın:
Future<List<Country>> fetchCountries() async {
return await network<List<Country>>(
request: (request) => request.get("/countries"),
cacheKey: "app_countries",
cacheDuration: const Duration(hours: 1),
) ?? [];
}
Önbelleği Temizleme
// Clear a specific cache key
await apiService.clearCache("app_countries");
// Clear all API cache
await apiService.clearAllCache();
api() Yardımcısı ile Önbellekleme
api<ApiService>(
(request) => request.fetchCountries(),
cacheKey: "app_countries",
cacheDuration: const Duration(hours: 1),
);
Önbellek Politikaları
Önbellekleme davranışı üzerinde ince ayarlı kontrol için CachePolicy kullanın:
| Politika | Açıklama |
|---|---|
CachePolicy.networkOnly |
Her zaman ağdan getir (varsayılan) |
CachePolicy.cacheFirst |
Önce önbelleği dene, ağa geri dön |
CachePolicy.networkFirst |
Önce ağı dene, önbelleğe geri dön |
CachePolicy.cacheOnly |
Yalnızca önbellek kullan, boşsa hata ver |
CachePolicy.staleWhileRevalidate |
Önbelleği hemen döndür, arka planda güncelle |
Kullanım
Future<List<Country>> fetchCountries() async {
return await network<List<Country>>(
request: (request) => request.get("/countries"),
cacheKey: "app_countries",
cacheDuration: const Duration(hours: 1),
cachePolicy: CachePolicy.staleWhileRevalidate,
) ?? [];
}
Her Politikayı Ne Zaman Kullanmalı
- cacheFirst -- Nadiren değişen veriler. Önbelleğe alınmış veriyi anında döndürür, yalnızca önbellek boşsa ağdan getirir.
- networkFirst -- Mümkün olduğunda güncel olması gereken veriler. Önce ağı dener, başarısız olursa önbelleğe döner.
- staleWhileRevalidate -- Anında yanıt vermesi gereken ancak güncel kalması gereken arayüzler. Önbelleğe alınmış veriyi döndürür, ardından arka planda yeniler.
- cacheOnly -- Çevrimdışı mod. Önbelleğe alınmış veri yoksa hata verir.
Not: Bir
cachePolicybelirtmedencacheKeyveyacacheDurationsağlarsanız, varsayılan politikacacheFirst'tir.
Başarısız İstekleri Yeniden Deneme
Başarısız olan istekleri otomatik olarak yeniden deneyin.
Temel Yeniden Deneme
Future fetchUsers() async {
return await network(
request: (request) => request.get("/users"),
retry: 3,
);
}
Gecikmeli Yeniden Deneme
Future fetchUsers() async {
return await network(
request: (request) => request.get("/users"),
retry: 3,
retryDelay: Duration(seconds: 2),
);
}
Koşullu Yeniden Deneme
Future fetchUsers() async {
return await network(
request: (request) => request.get("/users"),
retry: 3,
retryIf: (DioException dioException) {
// Only retry on server errors
return dioException.response?.statusCode == 500;
},
);
}
Servis Düzeyinde Yeniden Deneme
apiService.setRetry(3);
apiService.setRetryDelay(Duration(seconds: 2));
apiService.setRetryIf((dioException) => dioException.response?.statusCode == 500);
Bağlantı Kontrolleri
Cihaz çevrimdışı olduğunda zaman aşımı beklemek yerine hızlıca başarısız olun.
Servis Düzeyinde
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(buildContext, decoders: modelDecoders);
@override
bool get checkConnectivityBeforeRequest => true;
...
}
İstek Başına
await network(
request: (request) => request.get("/users"),
checkConnectivity: true,
);
Dinamik
apiService.setCheckConnectivityBeforeRequest(true);
Etkinleştirildiğinde ve cihaz çevrimdışı olduğunda:
networkFirstpolitikası önbelleğe geri döner- Diğer politikalar hemen
DioExceptionType.connectionErrorfırlatır
İptal Token'ları
Bekleyen istekleri yönetin ve iptal edin.
// Create a managed cancel token
final token = apiService.createCancelToken();
await apiService.get('/endpoint', cancelToken: token);
// Cancel all pending requests (e.g., on logout)
apiService.cancelAllRequests('User logged out');
// Check active request count
int count = apiService.activeRequestCount;
// Clean up a specific token when done
apiService.removeCancelToken(token);
Kimlik Doğrulama Başlıkları Ayarlama
Her isteğe kimlik doğrulama başlıkları eklemek için setAuthHeaders'ı geçersiz kılın. Bu metot, shouldSetAuthHeaders true olduğunda (varsayılan) her istekten önce çağrılır.
class ApiService extends NyApiService {
...
@override
Future<RequestHeaders> setAuthHeaders(RequestHeaders headers) async {
String? myAuthToken = Auth.data(field: 'token');
if (myAuthToken != null) {
headers.addBearerToken(myAuthToken);
}
return headers;
}
}
Kimlik Doğrulama Başlıklarını Devre Dışı Bırakma
Kimlik doğrulama gerektirmeyen genel uç noktalar için:
// Per-request
await network(
request: (request) => request.get("/public-endpoint"),
shouldSetAuthHeaders: false,
);
// Service-level
apiService.setShouldSetAuthHeaders(false);
Ayrıca bakınız: Kimlik Doğrulama kullanıcıları doğrulama ve token saklama hakkında ayrıntılar için.
Token Yenileme
Token süresinin dolmasını yönetmek için shouldRefreshToken ve refreshToken'ı geçersiz kılın. Bunlar her istekten önce çağrılır.
class ApiService extends NyApiService {
...
@override
Future<bool> shouldRefreshToken() async {
// Check if the token needs refreshing
return false;
}
@override
Future<void> refreshToken(Dio dio) async {
// Use the fresh Dio instance (no interceptors) to refresh the token
dynamic response = (await dio.post("https://example.com/refresh-token")).data;
// Save the new token to storage
await Auth.set((data) {
data['token'] = response['token'];
return data;
});
}
}
refreshToken'daki dio parametresi, interceptor döngülerini önlemek için servisin ana örneğinden ayrı yeni bir Dio örneğidir.
Singleton API Servisi
Varsayılan olarak, api yardımcısı her seferinde yeni bir örnek oluşturur. Singleton kullanmak için, config/decoders.dart'ta fabrika yerine bir örnek geçirin:
final Map<Type, dynamic> apiDecoders = {
ApiService: () => ApiService(), // New instance each time
ApiService: ApiService(), // Singleton — same instance always
};
Gelişmiş Yapılandırma
Özel Dio Başlatma
class ApiService extends NyApiService {
ApiService({BuildContext? buildContext}) : super(
buildContext,
decoders: modelDecoders,
initDio: (Dio dio) {
dio.options.validateStatus = (status) => status! < 500;
return dio;
},
);
}
Dio Örneğine Erişim
Dio dioInstance = apiService.dio;
Response response = await dioInstance.request(
'/custom-endpoint',
options: Options(method: 'OPTIONS'),
);
Sayfalandırma Yardımcısı
apiService.setPagination(
1,
paramPage: 'page',
paramPerPage: 'per_page',
perPage: '20',
);
Olay Callback'leri
apiService.onSuccess((response, data) {
print('Success: ${response.statusCode}');
});
apiService.onError((dioException) {
print('Error: ${dioException.message}');
});
Geçersiz Kılınabilir Özellikler
| Özellik | Tür | Varsayılan | Açıklama |
|---|---|---|---|
baseUrl |
String |
"" |
Tüm istekler için temel URL |
interceptors |
Map<Type, Interceptor> |
{} |
Dio interceptor'ları |
decoders |
Map<Type, dynamic>? |
{} |
JSON dönüştürme için model decoder'ları |
shouldSetAuthHeaders |
bool |
true |
İsteklerden önce setAuthHeaders'ın çağrılıp çağrılmayacağı |
retry |
int |
0 |
Varsayılan yeniden deneme sayısı |
retryDelay |
Duration |
1 second |
Yeniden denemeler arası varsayılan gecikme |
checkConnectivityBeforeRequest |
bool |
false |
İsteklerden önce bağlantıyı kontrol et |