performApptiveLink<T> method

Future<T?> performApptiveLink<T>({
  1. required ApptiveLink link,
  2. bool isRetry = false,
  3. dynamic body,
  4. Map<String, String> headers = const {},
  5. Map<String, String>? queryParameters,
  6. required Future<T?> parseResponse(
    1. Response response
    ),
})

Perform a action represented by link body is the body of the request headers will be added in addition to ApptiveGridClient.defaultHeaders queryParameters will override any queryParameters in ApptiveLink.uri parseResponse will be called with http.Response if the request has been successful

Implementation

Future<T?> performApptiveLink<T>({
  required ApptiveLink link,
  bool isRetry = false,
  dynamic body,
  Map<String, String> headers = const {},
  Map<String, String>? queryParameters,
  required Future<T?> Function(http.Response response) parseResponse,
}) async {
  final request = http.Request(
    link.method,
    _generateApptiveGridUri(link.uri).replace(
      queryParameters: queryParameters ?? link.uri.queryParameters,
    ),
  );

  if (body != null) {
    request.body = json.encode(body);
  }

  request.headers.addAll(_createHeadersWithDefaults(headers));

  final streamResponse = await _client.send(request);
  final response = await http.Response.fromStream(streamResponse);

  if (response.statusCode >= 400) {
    if (response.statusCode == 401 && !isRetry) {
      await authenticator.checkAuthentication();
      return performApptiveLink(
        link: link,
        body: body,
        headers: headers,
        queryParameters: queryParameters,
        isRetry: true,
        parseResponse: parseResponse,
      );
    } else {
      throw response;
    }
  }

  return parseResponse(response);
}