doMultipartRequest method
Send a multipart post request to the specified uri. The data / body of the request has to be provided as map. (key, value) The files to send have to be provided as map containing the source file uri. As result a json object of the "type" Status is expected.
Implementation
Future<Status> doMultipartRequest(
Uri uri,
Map<String, String> body, {
Map<String, Uri>? files,
User? user,
QueryType? queryType,
}) async {
var request = http.MultipartRequest('POST', uri);
request.headers.addAll(
_buildHeaders(
user: user,
isTestModeActive:
OpenFoodAPIConfiguration.getQueryType(queryType) != QueryType.PROD,
) as Map<String, String>,
);
request.headers.addAll({'Content-Type': 'multipart/form-data'});
addUserAgentParameters(body);
request.fields.addAll(body);
if (user != null) {
request.fields.addAll(user.toData());
}
// add all file entries to the request
if (files != null) {
for (MapEntry<String, Uri> entry in files.entries) {
List<int> fileBytes =
await UriReader.instance!.readAsBytes(entry.value);
var multipartFile = http.MultipartFile.fromBytes(entry.key, fileBytes,
filename: basename(entry.value.toString()));
request.files.add(multipartFile);
}
}
// get the response status
Status status = await request.send().then((response) {
if (response.statusCode == 200) {
return response.stream.first.then((responseBody) {
try {
return Status.fromJson(json.decode(utf8.decode(responseBody)));
} catch (e) {
//When the server returns html instead of json
return Status(status: 200, body: utf8.decode(responseBody));
}
});
} else {
return Status(
status: response.statusCode, error: response.reasonPhrase);
}
});
return status;
}