如何在 Flutter 中使用 http post 多部分请求发送 json 对象

Ano*_*oop 2 http dart flutter

我必须发送一个包含图像、正文和标头的多部分 HTTP POST 请求,请查找正文格式

 body: {
        "Id":Id,
        "Details": {
          "name": Name,
          "centroid": centroid,
          "attribute": {
            "boundaryOpacity": boundaryOpacity,
            "boundaryWeight": boundaryWeight,
            "boundaryColor": boundaryColor,
            "labelColor": labelColor,
          },
},}
Run Code Online (Sandbox Code Playgroud)
 headers: {
        'tenantId': tenantId,
        'Content-Type': 'multipart/form-data',
        'x-access-token': token
      },
Run Code Online (Sandbox Code Playgroud)

我必须随此请求一起发送图像。请帮助我。

小智 5

您可以将地图转换为 multipartRequest 并在 multipartRequest 中设置标头。

Future<void> addProject(Project project, [File? file]) async {
    final url = Uri.parse('$baseUrl/api/projects');

    final format = DateFormat('yyyy-MM-dd');
    final completionDate = format.format(project.completionDate);
    final data = {
      'id': project.id,
      'title': project.title,
      'description': project.description,
      'image': project.image,
      'completion_date': completionDate,
    };

    try {
      var request = http.MultipartRequest('POST', url);
      request = jsonToFormData(request, data);
      request.headers['X-Requested-With'] = "XMLHttpRequest";
      request.headers['Authorization'] = "Bearer $authToken";

      if (file != null) {
        request.files
            .add(await http.MultipartFile.fromPath("image", file.path));
      }
      final response = await request.send();
      final responseData = await response.stream.toBytes();
      final responseString = String.fromCharCodes(responseData);
      print(responseString)
      notifyListeners();
    } catch (error) {
      print('Error add project $error');
      throw (error);
    }    
}
jsonToFormData(http.MultipartRequest request, Map<String, dynamic> data) {
    for (var key in data.keys) {
      request.fields[key] = data[key].toString();
    }
    return request;
}
Run Code Online (Sandbox Code Playgroud)