Flutter,通过Dio/http向服务器发送嵌套的FormData

bn31dyow  于 2022-12-27  发布在  Flutter
关注(0)|答案(3)|浏览(279)

我想发布数据到postgres服务器。我需要发送注册表中的信息沿着一些图片。所以我需要使用multipart/form-data。问题是我的注册表相当复杂,有几个嵌套对象(下面我将粘贴一部分,这样你就可以看到我在说什么)。
经过两天的研究和尝试不同的选项,我不能让它工作。无论是http或Dio包,它似乎像在Dio包FormData.fromMap()是formitiing它不正确...
是否有任何方法可以让它工作,或者我已经要求有人从后端分开注册表和图片为两个不同的请求,并发送它作为json...
下面是我的表格的一部分:

FormData.fromMap({
      "questionnaire": {
        "horse": {"name": "Abisynia", "breed": "demo", "sex": "male"},
        "owner": {
          "personal_data": "John Doe",
          "email": "asasdasss@gmail.com",
          "phone_number": "3556234432"
        },
        "breakfast": {"name": "morning", "manufacturer": "Adasa", "amount": 1},
        "dinner": {"name": "noon", "manufacturer": "Aasd", "amount": 2},
        "supper": {"name": "evening", "manufacturer": "ASds", "amount": 3}
      }
    })

以下是我在Postman上发帖时服务器上发送的日志(它工作正常!):

以下是我尝试通过应用程序发帖时的日志:

我会很感激任何想法...

egdjgwm8

egdjgwm81#

在传递给FormData之前对嵌套的json进行编码。它将工作。例如:

String horseJson = json.encode({"name": "Abisynia", "breed": "demo", "sex": "male"});
String ownerJson = json.encode({
          "personal_data": "John Doe",
          "email": "asasdasss@gmail.com",
          "phone_number": "3556234432"
        });
String breakfastJson = json.encode({"name": "morning", "manufacturer": "Adasa", "amount": 1});
String dinnerJson = json.encode({"name": "noon", "manufacturer": "Aasd", "amount": 2});
String supperJson = json.encode({"name": "evening", "manufacturer": "ASds", "amount": 3});
String questiinnaireJson = json.encode({
        "horse": horseJson,
        "owner": ownerJson,
        "breakfast": breakfastJson,
        "dinner": dinnerJson,
        "supper": supperJson
      });
FormData formData = FormData.fromMap({
      "questionnaire": questiinnaireJson
    });
var response = await dio.post(url, data: formData, options: Options(headers:_headers));
ecfdbz9o

ecfdbz9o2#

要使用FormData发送JSON数据,需要将其作为MultipartFile发送,并将内容类型指定为"application/json"。
就像这样:

final data = FormData.fromMap({
    "file": await MultipartFile.fromFile(
      path,
      filename: name,
    ),
    "jsonData": MultipartFile.fromString(
      jsonEncode({"name": "user_name"}),
      contentType: MediaType.parse('application/json'),
    ),
  },
);
qoefvg9y

qoefvg9y3#

经过几个小时的搜索,我解决了它。
如果你想发布单个嵌套的Map,可以说:

    • 错误:**
FormData.fromMap({

 parent_key: { child_key: child_value }

})

您需要将其转换为:

    • 正确**
FormData.fromMap({

 parent_key.child_key: child_value

})

如果你想发布Map列表,让我们说:

    • 错误:**
FormData.fromMap({

 parent_key: [

   { child_key: child_value },
   { child_key: child_value_02 }
]

})

您需要将其转换为:

    • 正确**
FormData.fromMap({

 parent_key[0]child_key: child_value
 parent_key[1]child_key: child_value_02

})

相关问题