
رتروفت یه کتابخونه ایه که به ما کمک میکنه ارتباط با شبکه که از نوع پروتکل HTTP هست یا به عبارت بهتر ارتباط با اند پوینت های rest رو برای ما آسون تر و تمیز تر میکنه
برای اینکه از رتروفت در فلاتر استفاده کنیم نیازه که چند پکیج رو به همراه اون نصب داشته باشیم پس برای نصب هر کدوم به روش زیر عمل میکنیم
flutter pub add retrofit logger json_annotation dev:retrofit_generator dev:build_runner dev:json_serializable
خب اولین پکیج که خود رتروفت هست و دومی هم لاگر برای لاگ زدن رتروفت در صورت بروز ارور و اینا و سومی که جیسون انوتیشن برای انوتیشن گذاری استفاده میشه (همون که اولش اتساین(@) داره)
رتروفت جنریتور که توی دیپندنسی دولوپ هست برای تولید کد های رتروفت و بیلد راننر هم برای اجرای دستور بیلد و همچنین جیسون سریالازبل برای سریالایز کردن مدل های ما هست
برای تعریف ای پی ای هامون مثل مثال زیر عمل میکنیم
import 'package:dio/dio.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:retrofit/retrofit.dart'; part 'example.g.dart'; @RestApi(baseUrl: 'https://MyApi.com/v1') abstract class RestClient { factory RestClient(Dio dio, {String? baseUrl}) = _RestClient; @GET('/tasks') Future<List<Task>> getTasks(); }
ما فرض می کنیم که فایل ما به نام example.dart هست بعد از ایمپورت های اصلی باید به دارت(یا همون بیلد راننر) بگیم که آقا این فایل من که example.dart هست قراره بخشی از اون رو توی فایل example.g.dart جنریت بشه پس کد 'part 'example.g.dart رو اضافه میکنیم
در مرحله بعد یه انوتیشن داریم تحت RestApi@ که این انوتیشن بهش پارامتر بیس یو آرل میدیم که این پایه url ما هست برای مثال ما آدرس های زیر رو داریم
https://MyApi.com/v1/tasks/
https://MyApi.com/v1/task/
https://MyApi.com/v1/delete/task/{id}/
خب این سه تا یو آر ال بیس ما میشه https://MyApi.com/v1 و در ادامه تغییر میکنه
پس توی انوتیشن RestApi@ آدرس پایه مون رو میدیم
یک ابسترکت کلاس می نویسیم به همراه اسمی که میخوایم که اسمش گذاشتیم RestClient خب بعد توی یک فکتوری بهش دیو و آدرس پایه رو تعریف کردیم و مساوی آندرلاین اسم کلاس
خب حالا وقت تعریف کردن متود هامون رسیده که حالات مختلف داره برای مثال برای درخواست GET از آدرس /https://MyApi.com/v1/tasks چون آدرس پایه رو بهش دادیم کافیه انتهایی که میخوایم رو بهش بدیم که میشه
GET('/tasks/')@
حالا کلاسمون که قراره چی بر بگردونه از نوع فیوچر مینویسیم که اینجا قراره لیستی از مدل Task بر بگردونه
خب تعریف انجام شد بریم تا کد رو جنریت کنیم
برای جنریت کردن کد رتروفت کافیه دستور زیر رو توی ترمینال پروژه اجرا کنیم
dart run build_runner build
و بعد از پایان کار تمومه میتونی درخواست رو بزنی
خب ما که فقط نیاز به یه درخواست ساده GET تنها نداریم ممکنه درخواست ما دیتا داشته باشه و یا حتی Header و شایدم داینامیک باشه لینک ما یعنی یه آیدی بخوایم وسط لینک بذاریم و بعد درخواست رو بدیم
اضافه کردن دیتا به درخواست یا همون body کافیه که اونجا که فیوچر رو تعریف میکنیم انوتیشن Body ضافه کنیم که میشه به شکل زیر
@POST("/task/") Future<Task> postTask(@Body() Map<String, dynamic> data);
حالا اگه بخوایم heder هم اضافه کنیم هم مثل بادی عمل میکنیم و انوتیشن Header میذاریم و هدری که میخوایم ارسال بشه مثلا میخوام Content-Type بفرستم
@POST("/task/") Future<Task> postTask(@Header('Content-Type') String contentType, @Body() Map<String, dynamic> data);
اگر دیدی نمیشه بجای ایمپورت dio اینو ایمپورت کن
import 'package:dio/dio.dart' hide Headers;
برای اینکه بتونیم داینامیک لینک داشته باشیم هم داینامیک لینک رو به شکل زیر تعریف میکنیم
@DELETE('delete/task/{id}/') Future<void> deleteTask(@Path('id') String taskId);
در اینجا درخواست دیلیت با آیدی که توی آدرس تعریف کردیم میره
برای استفاده از رتروفت کافیه کلاس آبسترکتی که تعریف کردیم رو بسازیم و دیو رو بهش پاس بدیم و متود هارو صدا بزنیم
final dio = Dio(); final myRestClinet = RestClient(dio); try{ final tasks = await myRestClient.getTasks(); }on DioException catch(e){ // TODO: Catch error }
امیدوارم این پست براتون مفید شده باشه و از استفاده از رتروفت لذت ببرید
منابع من برای این پست