[dart-dio] Adds support for multipart form data post body (#4797)

* [dart-dio] Adds support for multipart form data post body

* [dart-dio] Fixes issues around formData
This commit is contained in:
Josh Burton 2020-01-02 19:03:37 +13:00 committed by William Cheng
parent d643b2706a
commit 39ba6bbfb1
3 changed files with 52 additions and 12 deletions

View File

@ -232,6 +232,8 @@ public class DartDioClientCodegen extends DartClientCodegen {
supportingFiles.add(new SupportingFile("pubspec.mustache", "", "pubspec.yaml"));
supportingFiles.add(new SupportingFile("analysis_options.mustache", "", "analysis_options.yaml"));
supportingFiles.add(new SupportingFile("apilib.mustache", libFolder, "api.dart"));
supportingFiles.add(new SupportingFile("api_util.mustache", libFolder, "api_util.dart"));
supportingFiles.add(new SupportingFile("serializers.mustache", libFolder, "serializers.dart"));
supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore"));
@ -346,6 +348,10 @@ public class DartDioClientCodegen extends DartClientCodegen {
op.vendorExtensions.put("isForm", isForm);
op.vendorExtensions.put("isMultipart", isMultipart);
if (op.getHasFormParams()) {
fullImports.add("package:" + pubName + "/api_util.dart");
}
Set<String> imports = new HashSet<>();
for (String item : op.imports) {
if (!modelToIgnore.contains(item.toLowerCase(Locale.ROOT))) {
@ -356,6 +362,7 @@ public class DartDioClientCodegen extends DartClientCodegen {
}
modelImports.addAll(imports);
op.imports = imports;
}
objs.put("modelImports", modelImports);

View File

@ -25,10 +25,9 @@ class {{classname}} {
String path = "{{{path}}}"{{#pathParams}}.replaceAll("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}};
// query params
Map<String, dynamic> queryParams = {};
Map<String, String> headerParams = Map.from(headers ?? {});
Map<String, String> formParams = {};
dynamic bodyData;
{{#headerParams}}
headerParams["{{baseName}}"] = {{paramName}};
@ -38,10 +37,27 @@ class {{classname}} {
{{/queryParams}}
queryParams.removeWhere((key, value) => value == null);
headerParams.removeWhere((key, value) => value == null);
formParams.removeWhere((key, value) => value == null);
List<String> contentTypes = [{{#consumes}}
"{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/consumes}}];
List<String> contentTypes = [{{#consumes}}"{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/consumes}}];
{{#hasFormParams}}
Map<String, dynamic> formData = {};
{{#formParams}}
{{#isMultipart}}
{{^isFile}}
if ({{paramName}} != null) {
formData['{{baseName}}'] = parameterToString({{paramName}});
}
{{/isFile}}
{{#isFile}}
if ({{paramName}} != null) {
formData['{{baseName}}'] = MultipartFile.fromBytes({{paramName}}, filename: "{{baseName}}");
}
{{/isFile}}
{{/isMultipart}}
{{/formParams}}
bodyData = FormData.fromMap(formData);
{{/hasFormParams}}
{{#bodyParam}}
{{#isListContainer}}
@ -52,14 +68,13 @@ class {{classname}} {
var serializedBody = _serializers.serialize({{paramName}});
{{/isListContainer}}
var json{{paramName}} = json.encode(serializedBody);
bodyData = json{{paramName}};
{{/bodyParam}}
return _dio.request(
path,
queryParameters: queryParams,
{{#bodyParam}}
data: json{{paramName}},
{{/bodyParam}}
data: bodyData,
options: Options(
method: '{{httpMethod}}'.toUpperCase(),
headers: headerParams,

View File

@ -0,0 +1,18 @@
/// Format the given parameter object into string.
String parameterToString(dynamic value) {
if (value == null) {
return '';
} else if (value is DateTime) {
return value.toUtc().toIso8601String();
{{#models}}
{{#model}}
{{#isEnum}}
} else if (value is {{classname}}) {
return {{classname}}TypeTransformer().encode(value).toString();
{{/isEnum}}
{{/model}}
{{/models}}
} else {
return value.toString();
}
}