rest_api_client 2.3.1 copy "rest_api_client: ^2.3.1" to clipboard
rest_api_client: ^2.3.1 copied to clipboard

Abstraction for communicating with REST API in flutter projects. Incorporates exception handling and jwt with refresh token authorization.

Rest api client #

Abstraction for communicating with REST API in flutter projects. Incorporates exception handling and jwt with refresh token authorization. You can also find this package on pub as rest_api_client

Usage #

This must be called once per application lifetime

await RestApiClient.initFlutter();

RestApiClient restApiClient = RestApiClientImpl(
  options: RestApiClientOptions(
    //Defines your base API url eg. https://mybestrestapi.com
    baseUrl: 'https://gorest.co.in/public/v2/',

    //Enable caching of response data
    cacheEnabled: true,
  ),
  authOptions: AuthOptions(
    //Define refresh token endpoint for RestApiClient
    //instance to use the first time response status code is 401
    refreshTokenEndpoint: '/api/auth/refresh-token',

    //Define the name of your api parameter name
    //on RefreshToken endpoint eg. 'refreshToken' or 'value' ...
    refreshTokenParameterName: 'token',

    refreshTokenBodyBuilder: (jwt, refreshToken) => {
      'accessToken': jwt,
      'refreshToken': refreshToken,
    },

    refreshTokenHeadersBuilder: (jwt, _) => {
      RestApiClientKeys.authorization: 'Bearer $jwt',
    },

    //This method is called on successfull call to refreshTokenEndpoint
    //Provides a way to get a jwt from response, much like
    //resolveValidationErrorsMap callback
    resolveJwt: (response) => response.data['accessToken'],

    //Much like resolveJwt, this method is used to resolve
    //refresh token from response
    resolveRefreshToken: (response) => response.data['refreshToken'],
  ),
  loggingOptions: LoggingOptions(
    //Toggle logging of your requests and responses
    //to the console while debugging
    logNetworkTraffic: true,
  ),
  exceptionOptions: ExceptionOptions(
    resolveValidationErrorsMap: (response) {
      if (response != null && response.data != null && response.data['code'] != null) {
        return {
          'ERROR': [response.data['code']],
        };
      }

      return {};
    },
  ),
  cacheOptions: CacheOptions(
    useAuthorization: true,
    cacheLifetimeDuration: const Duration(days: 10),
    resetOnRestart: false,
  ),
  interceptors: [
    InterceptorsWrapper(
      onRequest: (options, handler) {
        log('Logging before request');

        return handler.next(options);
      },
      onResponse: (response, handler) {
        log('Logging on response');

        return handler.next(response);
      },
      onError: (DioException e, handler) {
        log('Logging on error');

        return handler.next(e);
      },
    ),
  ],
);

init must be called, preferably right after the instantiation

await restApiClient.init();

Use restApiClient from this point on

If you are using authentication in you app it would look like this

final response = await restApiClient.post(
  '/Authentication/Authenticate',
  data: {'username': 'john', 'password': 'Flutter_is_awesome1!'},
);

Extract the values from response

var jwt = response.data['jwt'];
var refreshToken = response.data['refreshToken'];

Let's asume that somehow we got jwt and refresh token Probably pinged our api Authentication endpoint to get these two values

jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZmx1dHRlciI6IkZsdXR0ZXIgaXMgYXdlc29tZSIsImNoYWxsZW5nZSI6IllvdSBtYWRlIGl0LCB5b3UgY3JhY2tlZCB0aGUgY29kZS4gWW91J3JlIGF3ZXNvbWUgdG9vLiIsImlhdCI6MTUxNjIzOTAyMn0.5QJz8hhxYsHxShS4hWKdHzcFH_IsQQZAnWSEcHJkspE';
refreshToken = 'c91c03ea6c46a86cbc019be3d71d0a1a';

Set the authorization

restApiClient.authorize(jwt: jwt, refreshToken: refreshToken);

Create authorized requests safely

restApiClient.get('/Products');

Ignore server errors that might happen in the next request

restApiClient.exceptionHandler.exceptionOptions.showInternalServerErrors = false;

try {
  restApiClient.get(
    '/Products',
    queryParameters: {'name': 'darts'},
  );
} catch (e) {
  print(e);
}

Ignore all exceptions that might happen in the next request

restApiClient.exceptionHandler.exceptionOptions.disable();

restApiClient.post(
  '/Products/Reviews/234',
  data: {'grade': 5, 'comment': 'Throwing dart is not safe but upgrading to Dart 2.12.1 is. #nullsafety'},
);
restApiClient.put(
  '/Products/Reviews/234',
  data: {
    'grade': 5,
    'comment': 'On the other hand throwing dartz is fun',
  },
);

restApiClient.delete('/Products/Reviews/234');
31
likes
150
pub points
81%
popularity

Publisher

unverified uploader

Abstraction for communicating with REST API in flutter projects. Incorporates exception handling and jwt with refresh token authorization.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

crypto, dio, flutter, jwt_decoder, pretty_dio_logger, storage_repository

More

Packages that depend on rest_api_client