doMultipartRequest method

Future<Status> doMultipartRequest(
  1. Uri uri,
  2. Map<String, String> body, {
  3. Map<String, Uri>? files,
  4. User? user,
  5. QueryType? queryType,
})

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