如何在颤动的多部分请求中发送对象列表?

Posted

技术标签:

【中文标题】如何在颤动的多部分请求中发送对象列表?【英文标题】:How to send List of objects in a multipart request in flutter? 【发布时间】:2020-07-02 14:16:05 【问题描述】:

我想在多部分请求中发送一个 ManageTagModel 列表以及其他模型和文件..

我不确定如何发送此模型列表..

这是我在没有列表的情况下发送多部分请求的代码:

   var uri = Uri.parse(...);
    final request = http.MultipartRequest('Post', uri);
    request.fields['Id'] = '3';
    request.fields['Name'] = siteModel.name;
    request.fields['MapAddress'] = siteModel.mapAddress;
    request.fields['Country'] = siteModel.country;
    request.fields['City'] = siteModel.city;
    request.fields['CategoryNb'] = siteModel.categoryNb;
    request.fields['UserId'] = userId;
    request.fields['Caption'] = caption;
    for (File i in
    multipleFiles) 

      final mimeTypeData =
      lookupMimeType(i.path, headerBytes: [0xFF, 0xD8]).split('/');
      print("IMAGE: " + i.path);
      // Attach the file in the request
      final file = await http.MultipartFile.fromPath('files', i.path);
      print(mimeTypeData[0] + " mimeTypeData[0]");
      print(mimeTypeData[1] + " mimeTypeData[1]");

      request.files.add(file);

这是我的模型:

  import 'dart:convert';

   class ManageTagModel 
   String posX;
 String posY;
 String postOrder;
 String tagger;
 String tagged;

  ManageTagModel(
  this.posX, this.posY, this.postOrder, this.tagger, this.tagged);

  //Flutter way of creating a constructor
  factory ManageTagModel.fromJson(Map<String, dynamic> json) => ManageTagModel(
  posX: json['PosX'],
  posY: json['PosY'],
  postOrder: json['PostOrder'],
  tagged: json['Tagged'],
  tagger: json['Tagger']);
  Map<String, dynamic> toMap() 
return 
  "PosX": posX,
  "PosY": posY,
  "PostOrder": postOrder,
  "Tagger": tagger,
  "Tagged": tagged
;



   List<ManageTagModel> fromJson(String jsonData) 
 // Decode json to extract a map
  final data = json.decode(jsonData);
  return List<ManageTagModel>.from(
  data.map((item) => ManageTagModel.fromJson(item)));
    

 String toJson(ManageTagModel data) 
 // First we convert the object to a map
 final jsonData = data.toMap();
  // Then we encode the map as a JSON string
 return json.encode(jsonData);
 

 List encodeToJson(List<ManageTagModel> list) 
 List jsonList = List();
 list.map((item) => jsonList.add(item.toMap())).toList();
 return jsonList;
 

我的后端c#方法有一个参数List

感谢任何帮助!

【问题讨论】:

【参考方案1】:

我很确定我来晚了,您可能已经找到了解决方案。我经历了多个线程,实际上并没有找到任何答案,但出于沮丧发现自己并自认为对于任何其他迷失的人类灵魂来说,答案实际上仍然不存在。因此,对于仍然停留在这里的任何人来说,这是我的解决方案,非常直观。

您只需将列表中的所有元素作为“文件”而不是“字段”添加到请求中。但是你必须使用fromString(),而不是fromPath() 方法。

final request = http.MultipartRequest('Post', uri);
List<String> ManageTagModel = ['xx', 'yy', 'zz'];
for (String item in ManageTagModel) 
    request.files.add(http.MultipartFile.fromString('manage_tag_model', item));

这对我有用,我希望它也对你有用。

【讨论】:

我通过上面在我的问题中所做的字段逐一发送列表元素来结束它。

以上是关于如何在颤动的多部分请求中发送对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何发送 jpeg 的多部分响应

如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串

我如何向最近的应用程序用户发送请求,就像颤动中的优步一样

如何在颤动的 POST 请求中将 Map 作为字符串发送?

如何在颤动中以对象形式在列表中添加文本字段值

如何在颤动中对对象列表中的json字符串进行编码