Getting Started

Setup HTTP Client

Implement a custom RestApiClient using Dio.

Create a Custom API Client

laravel_rest_api_flutter expects an implementation of RestApiClient.

Below is an example using Dio:

class ApiHttpClient implements RestApiClient {
  final Dio dio;

  ApiHttpClient({required this.dio});

  @override
  Future<RestApiResponse> get(
    String url, {
    Map<String, String>? headers,
    Map<String, String>? queryParams,
  }) async {
    try {
      final response = await dio.get(
        "\${dio.options.baseUrl}\$url",
        options: Options(headers: headers),
        queryParameters: queryParams,
      );
      return RestApiResponse(
        statusCode: response.statusCode,
        body: response.data,
      );
    } catch (exception, stackTrace) {
      return handleError(exception, stackTrace);
    }
  }

  @override
  Future<RestApiResponse> post(
    String url, {
    Map<String, String>? headers,
    Map<String, String>? queryParams,
    Object? body,
  }) async {
    try {
      final response = await dio.post(
        "\${dio.options.baseUrl}\$url",
        options: Options(headers: headers),
        queryParameters: queryParams,
        data: body,
      );
      return RestApiResponse(
        statusCode: response.statusCode,
        body: response.data,
        message: response.statusMessage,
      );
    } catch (exception, stackTrace) {
      return handleError(exception, stackTrace);
    }
  }

  @override
  Future<RestApiResponse> delete(
    String url, {
    Map<String, String>? headers,
    Map<String, String>? queryParams,
    Object? body,
  }) async {
    try {
      final response = await dio.delete(
        "\${dio.options.baseUrl}\$url",
        options: Options(headers: headers),
        queryParameters: queryParams,
        data: body,
      );
      return RestApiResponse(
        statusCode: response.statusCode,
        body: response.data,
      );
    } catch (exception, stackTrace) {
      return handleError(exception, stackTrace);
    }
  }

  @override
  RestApiResponse handleError(dynamic exception, StackTrace stackTrace) {
    if (exception is DioException) {
      return RestApiResponse(
        statusCode: exception.response?.statusCode,
        body: exception.response?.data ?? {'error': exception.message},
      );
    }
    return RestApiResponse(
      statusCode: 500,
      body: {'error': exception},
    );
  }
}

You can centralize your Dio configuration (base URL, interceptors, auth headers…) and pass it to ApiHttpClient.