request method

Future<Map<String, dynamic>?> request({
  1. required String path,
  2. Map<String, dynamic>? parameters,
  3. bool withAuthentication = false,
  4. String type = 'POST',
})

Send command to Bybit

Implementation

Future<Map<String, dynamic>?> request(
    {required String path,
    Map<String, dynamic>? parameters,
    bool withAuthentication = false,
    String type = 'POST'}) async {
  var map = SortedMap(Ordering.byKey());

  if (parameters != null) {
    /// Keep the parameters sorted alphabetically for valid requests
    parameters.forEach((id, value) {
      log.d('ByBitRest.Parameter ' + id + ': ' + value.toString());
      map[id] = value;
    });
  }

  var params = '';
  if (withAuthentication) {
    map['api_key'] = key;
    var timestamp = DateTime.now().millisecondsSinceEpoch;
    map['timestamp'] = timestamp;
    map['recv_window'] = receiveWindow;
    var signature = sign(secret: password, query: map);
    map['sign'] = signature;
  }

  http.Response response;
  var header = <String, String>{};
  header['Content-Type'] = 'application/json; charset=utf-8';
  if (type == 'POST') {
    var finalUrl = url + path;
    var query = '{';
    map.forEach((key, value) {
      query += '"$key":';
      if (value is String) {
        query += '"$value"';
      } else if (value is double) {
        query = query + '"' + value.toString() + '"';
      } else {
        query += value.toString();
      }
      query += ',';
    });
    // replace last ',' in query string
    if (map.isNotEmpty) query = query.substring(0, query.length - 1);
    query += '}';
    log.d(
        'ByBitRest.POST ' + finalUrl + ' ' + header.toString() + ' ' + query);
    response =
        await http.post(Uri.parse(finalUrl), headers: header, body: query);
    if (response.statusCode != 200) {
      log.e('HTTP response status code: ' + response.statusCode.toString());
    }
    return jsonDecode(response.body) as Map<String, dynamic>?;
  } else if (type == 'GET') {
    header['Content-Type'] = 'application/json; charset=utf-8';
    if (map.isNotEmpty) params = '?';
    map.forEach((id, value) {
      params = params + id.toString() + '=' + value.toString() + '&';
    });
    // remove last '&' from string
    if (map.isNotEmpty) params = params.substring(0, params.length - 1);
    var finalUrl = url + path + params;
    log.d('ByBitRest.GET ' + finalUrl);
    response = await http.get(Uri.parse(finalUrl), headers: header);
    if (response.statusCode != 200) {
      log.e('HTTP response status code: ' + response.statusCode.toString());
    }
    return jsonDecode(response.body) as Map<String, dynamic>?;
  } else {
    log.e('Request type ' + type + ' is not supported');
    return jsonDecode('') as Map<String, dynamic>?;
  }
}