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);
}