flutter - 如何在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);
});
}
解决方案
你可以这样试试
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;
}
推荐阅读
- mysql - Windows 上的 MySQL 8.0 / Workbench:错误代码:2068。由于访问限制,LOAD DATA LOCAL INFILE 文件请求被拒绝
- java - 如何检测二维码被扫描?
- gnuplot - 传递给“replot”的参数可以替换以前的绘图参数吗?
- angular - 在 Angular 中使用动态输入和鼠标移动时未显示 SVG 标题工具提示
- xcode - 在 XCode 中更新 C++ 语言方言设置会在应用程序中产生多个错误
- javascript - 在带有参数的出版物中使用流星的 simple:rest 包
- javascript - 节点 net.createServer(),将数据发送回客户端,而不是 on('data') 回调
- python - 如何修复模型的django实例
- keras - Keras 中嵌入的输入层维度
- java - 当我构建 Docker 映像时,由于 UnsupportedClassVersionError 导致 Gradle 测试失败 - 在本地它工作正常