request<TData, TResponse> method

Future<RestResponse<TResponse>> request<TData, TResponse>(
  1. ApiRequestMethod method,
  2. RoutePattern endpoint,
  3. Map<String, dynamic> urlParams, {
  4. Map<String, List<String>> headers = const {},
  5. Map<String, String?> query = const {},
  6. dynamic body,
  7. TransferBean<TData>? bean,
})

Implementation

Future<RestResponse<TResponse>> request<TData, TResponse>(
  ApiRequestMethod method,
  RoutePattern endpoint,
  Map<String, dynamic> urlParams, {
  Map<String, List<String>> headers = const {},
  Map<String, String?> query = const {},
  dynamic body,
  TransferBean<TData>? bean,
}) async {
  final uri = _httpClient.address.replace(
    path: endpoint.encode(urlParams),
    queryParameters: query.isNotEmpty ? query : null,
  );

  final requestHeaders = {
    ...headers,
    if (auth != null) HttpHeaders.authorization: [auth!.authorization],
  };

  final bodyData = () {
    if (body is Uint8List) {
      requestHeaders[HttpHeaders.contentType] = [Mime.octetStream];
      return Stream.value(body);
    } else if (body is String) {
      if (!requestHeaders.containsKey(HttpHeaders.contentType)) {
        requestHeaders[HttpHeaders.contentType] = [
          '${Mime.plainText}; charset=UTF-8'
        ];
      }
      return Stream.value(utf8.encode(body));
    } else if (body is HttpFormData) {
      requestHeaders[HttpHeaders.contentType] = [Mime.formData];
      return Stream.value(utf8.encode(body.toString()));
    } else if (body != null) {
      requestHeaders[HttpHeaders.contentType] = [
        '${Mime.json}; charset=UTF-8'
      ];
      return Stream.value(utf8.encode(jsonEncode(body)));
    } else {
      return Stream<List<int>>.empty();
    }
  }();

  final response = await _httpClient
      .request(HttpRequest(method, uri, requestHeaders, bodyData));

  return await handleResponse<TData, TResponse>(response, bean);
}