[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-chiamate-di-rete-tipizzate-in-flutter-con-retrofit-e-dio":3,"comments-article-chiamate-di-rete-tipizzate-in-flutter-con-retrofit-e-dio":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},49,"Chiamate di rete tipizzate in Flutter con Retrofit e Dio","chiamate-di-rete-tipizzate-in-flutter-con-retrofit-e-dio","Scopri come generare automaticamente un client REST tipizzato in Flutter usando retrofit e Dio, riducendo il codice ripetitivo e i bug nelle chiamate API.","## Perché Retrofit in Flutter\n\nGestire manualmente le chiamate HTTP con Dio funziona bene, ma man mano che l'app cresce ci si ritrova a scrivere codice ripetitivo per costruire URL, serializzare parametri e deserializzare le risposte. Il pacchetto [`retrofit`](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fretrofit) risolve questo problema generando automaticamente un client REST tipizzato a partire da un'interfaccia annotata, appoggiandosi a Dio per il trasporto e a `json_serializable` per la serializzazione.\n\nIl risultato è un layer di rete dichiarativo, leggibile e a prova di refactoring: definisci *cosa* vuoi chiamare, non *come*.\n\n## Installazione\n\nAggiungi le dipendenze al `pubspec.yaml`:\n\n```yaml\ndependencies:\n  dio: ^5.4.0\n  retrofit: ^4.1.0\n  json_annotation: ^4.9.0\n\ndev_dependencies:\n  build_runner: ^2.4.8\n  retrofit_generator: ^8.1.0\n  json_serializable: ^6.7.1\n```\n\n## Definire i modelli\n\nPartiamo da un semplice modello serializzabile:\n\n```dart\nimport 'package:json_annotation\u002Fjson_annotation.dart';\n\npart 'user.g.dart';\n\n@JsonSerializable()\nclass User {\n  final int id;\n  final String name;\n  final String email;\n\n  User({required this.id, required this.name, required this.email});\n\n  factory User.fromJson(Map\u003CString, dynamic> json) => _$UserFromJson(json);\n  Map\u003CString, dynamic> toJson() => _$UserToJson(this);\n}\n```\n\n## Creare l'interfaccia del client\n\nQui sta il cuore di Retrofit: si dichiara un'interfaccia annotata con `@RestApi` e si descrivono gli endpoint con annotazioni come `@GET`, `@POST`, `@Path` e `@Body`.\n\n```dart\nimport 'package:dio\u002Fdio.dart';\nimport 'package:retrofit\u002Fretrofit.dart';\nimport 'user.dart';\n\npart 'api_client.g.dart';\n\n@RestApi(baseUrl: 'https:\u002F\u002Fapi.example.com')\nabstract class ApiClient {\n  factory ApiClient(Dio dio, {String baseUrl}) = _ApiClient;\n\n  @GET('\u002Fusers')\n  Future\u003CList\u003CUser>> getUsers();\n\n  @GET('\u002Fusers\u002F{id}')\n  Future\u003CUser> getUser(@Path('id') int id);\n\n  @POST('\u002Fusers')\n  Future\u003CUser> createUser(@Body() User user);\n\n  @GET('\u002Fusers')\n  Future\u003CList\u003CUser>> searchUsers(@Query('q') String query);\n\n  @DELETE('\u002Fusers\u002F{id}')\n  Future\u003Cvoid> deleteUser(@Path('id') int id);\n}\n```\n\n## Generare il codice\n\nUna volta definite interfaccia e modelli, esegui il generatore:\n\n```bash\ndart run build_runner build --delete-conflicting-outputs\n```\n\nQuesto crea i file `api_client.g.dart` e `user.g.dart` con tutta l'implementazione ripetitiva. Non dovrai mai scrivere a mano il parsing del JSON o la costruzione degli URL.\n\n## Usare il client\n\n```dart\nvoid main() async {\n  final dio = Dio();\n  final client = ApiClient(dio);\n\n  final users = await client.getUsers();\n  print('Utenti trovati: ${users.length}');\n\n  final user = await client.getUser(1);\n  print('Nome: ${user.name}');\n\n  final nuovo = await client.createUser(\n    User(id: 0, name: 'Mario', email: 'mario@example.com'),\n  );\n  print('Creato con id ${nuovo.id}');\n}\n```\n\n## Configurare Dio con interceptor\n\nUno dei vantaggi di appoggiarsi a Dio è poter riutilizzare tutta la sua potenza: interceptor per token di autenticazione, logging e gestione degli errori.\n\n```dart\nfinal dio = Dio(BaseOptions(\n  connectTimeout: const Duration(seconds: 10),\n  receiveTimeout: const Duration(seconds: 10),\n));\n\ndio.interceptors.add(\n  InterceptorsWrapper(\n    onRequest: (options, handler) {\n      options.headers['Authorization'] = 'Bearer $token';\n      handler.next(options);\n    },\n    onError: (error, handler) {\n      if (error.response?.statusCode == 401) {\n        \u002F\u002F logica di refresh del token\n      }\n      handler.next(error);\n    },\n  ),\n);\n\nfinal client = ApiClient(dio);\n```\n\n## Gestire header e form data\n\nRetrofit supporta anche header dinamici e invio di form:\n\n```dart\n@POST('\u002Flogin')\nFuture\u003CTokenResponse> login(\n  @Field('username') String username,\n  @Field('password') String password,\n);\n\n@GET('\u002Fprofile')\nFuture\u003CUser> profile(@Header('X-Api-Version') String version);\n```\n\nAnnotare i parametri con `@Field` invia automaticamente i dati come `application\u002Fx-www-form-urlencoded`, mentre `@Header` permette di passare header specifici a livello di singola chiamata.\n\n## Best practice\n\n- **Separa il layer di rete**: tieni le interfacce Retrofit in una cartella dedicata (`data\u002Fremote`) e non esporle direttamente alla UI, ma passa attraverso un repository.\n- **Gestisci le eccezioni**: le `DioException` vanno intercettate e convertite in errori di dominio (ad esempio con un tipo `Result`) prima di raggiungere i widget.\n- **Un client per dominio**: se l'API è ampia, suddividi le chiamate in più interfacce (`AuthApi`, `UserApi`, `ProductApi`) per mantenere il codice ordinato.\n- **Rigenera dopo ogni modifica**: ricordati di lanciare `build_runner` ogni volta che modifichi le annotazioni o i modelli.\n\n## Conclusioni\n\nRetrofit porta in Flutter un approccio dichiarativo e tipizzato alle chiamate REST, eliminando gran parte del codice boilerplate e riducendo gli errori. Combinato con Dio per il trasporto e `json_serializable` per la serializzazione, offre un layer di rete robusto e facilmente manutenibile, ideale per progetti di medie e grandi dimensioni.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002Fa38c9306-01ab-4e24-beac-b022cc186dda.jpg",null,"published","2026-07-23T04:00:37+00:00","Retrofit e Dio in Flutter: client REST tipizzato","Guida pratica a retrofit in Flutter: genera un client REST tipizzato con Dio e json_serializable, riducendo boilerplate ed errori nelle chiamate API.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1785219596557]