request method Null safety

Future<PaylikeResponse> request(
  1. String endpoint,
  2. RequestOptions? opts
)

Implementation

Future<PaylikeResponse> request(String endpoint, RequestOptions? opts) async {
  opts ??= RequestOptions();
  var url = Uri.parse(endpoint);
  io.HttpClientRequest? request;
  if (opts.form) {
    if (opts.formFields == null) {
      throw Exception('Cannot make a request as a form without formFields');
    }
    var formBodyParts = (opts.formFields as Map<String, String>)
        .keys
        .map((key) =>
            '$key=${Uri.encodeQueryComponent(opts?.formFields?[key] as String)}')
        .toList();
    var bodyBytes = utf8.encode(formBodyParts.join('&')); // utf8 encode
    request = await client.postUrl(url);
    // it's polite to send the body length to the server
    request.headers.set('Content-Length', bodyBytes.length.toString());
    request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
    // todo add other headers here
    request.add(bodyBytes);
  } else {
    if (opts.query != null) {
      url.replace(queryParameters: opts.query);
    }
    var headers = {
      'X-Client': opts.clientId,
      'Accept-Version': opts.version.toString(),
    };
    switch (opts.method) {
      case 'GET':
        request = await client.getUrl(url);
        break;
      case 'POST':
        request = await client.postUrl(url);
        headers = {
          ...headers,
          'Content-Type': 'application/json',
        };
        break;
      default:
        throw ('Unexpected error');
    }
    headers.forEach((key, value) {
      request?.headers.add(key, value);
    });
    if (opts.method == 'POST') {
      request.write(jsonEncode(opts.data));
    }
  }
  return _executeRequest(url: url, opts: opts, request: request);
}