首页 > 解决方案 > 如何在formdata颤动中发送对象

问题描述

我目前正在开发一个移动应用程序,而且我已经被困了好几天了。我一直在尝试发送一个发布请求来创建一个对象“离开”,如下面的代码所示。请求正文是 formData,键为“leave”,值为“jsonObject”。我尝试了很多方法,我想它与“Content-type”有关系。如果我将它更改为“multipart/form-data”,则响应变为 500,如果它是“application/json”,我总是得到 415 不支持的 mediaType。这是我使用 dio 包的代码,任何建议都会对您有所帮助,在此先感谢您。邮递员请求工作正常

Future createLeave() async {
        var leave = Conge(
          dateDemand: DateTime.now(),
          dateEnd: DateTime.now().add(Duration(days: 3)),
          dateStart: DateTime.now().add(Duration(days: 1)),
          type: "CSS",
          endDateDaySlot: "X",
          startDateDaySlot: "X",
        );
        Map<String, String> heads = {
          "X-Auth-Token": UserPreferences().token,
          "Content-type": 'application/json',
          "accept": "application/json"
        };
        FormData formData = FormData.fromMap({"leave": leave.toJson()});
        var dio = Dio();
        try {
          Response response = await dio.post(API + '/leave/add',
              data: formData,
              options:
                  Options(headers: heads, contentType: Headers.jsonContentType));
        } on Exception catch (e) {
          print(e);
        }
      }

我也尝试过使用 MultiPartRequest 但我总是得到 400 作为响应,客户端发送的请求在语法上不正确这是我的代码,任何人都可以帮我解决这个问题

Future create(Conge leave) async {
String url = API + "/leave/add";
var uri = Uri.parse(url);
var request = new http.MultipartRequest("POST", uri);
Map<String, String> heads = {
  "X-Auth-Token": UserPreferences().token,
  "Content-type": 'application/json',
};
request.headers.addAll(heads);
request.fields['leave'] = json.encode(leave.toJson());
var response = await request.send();
print(response.statusCode);
response.stream.transform(utf8.decoder).listen((value) {
  print(value);
});

}

标签: flutterdartpostform-datadio

解决方案


你可以这样试试

Future<http.Response> postImageWithData(String url, Map param,
      String imageKey, File file) async {
    print("Calling API: $url");
    print("Calling Parameters: $param");
    print("File: $file");

    var responseJson;
    var uri = Uri.parse(url);
    var request = http.MultipartRequest("POST", uri);

    var organisationDetails = {
      "title1": "Test 1",
      "title2": "Test 2",
      "title3": "Test 3",
      "title4": "Test 4"
    };

    request.fields["first_name"] = "test";
    request.fields["mobile_number"] = "mobile_number";
    request.fields["email"] = "test8@test.com";
    request.fields["password"] = "test@test8";
    request.fields["more_details"] = jsonEncode(moreDetails);


    request.headers.addAll({"Content-Type": "application/json"});
    // request.fields.addAll(param);

    if (file != null) {
      var img = await http.MultipartFile.fromPath(imageKey, file.path);
      request.files.add(img);
    }

    try {
      final response =
      await request.send().timeout(const Duration(seconds: 60));
      var res = await http.Response.fromStream(response);
      // responseJson = responseToJson(res);
      responseJson = res;
    } on SocketException {
      throw FetchDataException("You are not connected to internet");
    } on TimeoutException catch (e) {
      print('Time out');
      throw TimeoutException('Time out');
    }
    return responseJson;
  }

推荐阅读