multipartRequest static method
Implementation
static Future<ApiCallResponse> multipartRequest(
ApiCallType? type,
String apiUrl,
Map<String, dynamic> headers,
Map<String, dynamic> params,
bool returnBody,
bool decodeUtf8,
) async {
assert(
{ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type),
'Invalid ApiCallType $type for request with body',
);
bool Function(dynamic) _isFile = (e) =>
e is FFUploadedFile ||
e is List<FFUploadedFile> ||
(e is List && e.firstOrNull is FFUploadedFile);
final nonFileParams = toStringMap(
Map.fromEntries(params.entries.where((e) => !_isFile(e.value))));
List<http.MultipartFile> files = [];
params.entries.where((e) => _isFile(e.value)).forEach((e) {
final param = e.value;
final uploadedFiles = param is List
? param as List<FFUploadedFile>
: [param as FFUploadedFile];
uploadedFiles.forEach((uploadedFile) => files.add(
http.MultipartFile.fromBytes(
e.key,
uploadedFile.bytes ?? Uint8List.fromList([]),
filename: uploadedFile.name,
contentType: _getMediaType(uploadedFile.name),
),
));
});
final request = http.MultipartRequest(
type.toString().split('.').last, Uri.parse(apiUrl))
..headers.addAll(toStringMap(headers))
..files.addAll(files);
nonFileParams.forEach((key, value) => request.fields[key] = value);
final response = await http.Response.fromStream(await request.send());
return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
}