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

View File

@ -25,10 +25,9 @@ class {{classname}} {
String path = "{{{path}}}"{{#pathParams}}.replaceAll("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}}; String path = "{{{path}}}"{{#pathParams}}.replaceAll("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}};
// query params Map<String, dynamic> queryParams = {};
Map<String, dynamic> queryParams = {}; Map<String, String> headerParams = Map.from(headers ?? {});
Map<String, String> headerParams = Map.from(headers ?? {}); dynamic bodyData;
Map<String, String> formParams = {};
{{#headerParams}} {{#headerParams}}
headerParams["{{baseName}}"] = {{paramName}}; headerParams["{{baseName}}"] = {{paramName}};
@ -36,12 +35,29 @@ class {{classname}} {
{{#queryParams}} {{#queryParams}}
queryParams["{{baseName}}"] = {{paramName}}; queryParams["{{baseName}}"] = {{paramName}};
{{/queryParams}} {{/queryParams}}
queryParams.removeWhere((key, value) => value == null); queryParams.removeWhere((key, value) => value == null);
headerParams.removeWhere((key, value) => value == null); headerParams.removeWhere((key, value) => value == null);
formParams.removeWhere((key, value) => value == null);
List<String> contentTypes = [{{#consumes}} List<String> contentTypes = [{{#consumes}}"{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/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}} {{#bodyParam}}
{{#isListContainer}} {{#isListContainer}}
@ -52,14 +68,13 @@ class {{classname}} {
var serializedBody = _serializers.serialize({{paramName}}); var serializedBody = _serializers.serialize({{paramName}});
{{/isListContainer}} {{/isListContainer}}
var json{{paramName}} = json.encode(serializedBody); var json{{paramName}} = json.encode(serializedBody);
bodyData = json{{paramName}};
{{/bodyParam}} {{/bodyParam}}
return _dio.request( return _dio.request(
path, path,
queryParameters: queryParams, queryParameters: queryParams,
{{#bodyParam}} data: bodyData,
data: json{{paramName}},
{{/bodyParam}}
options: Options( options: Options(
method: '{{httpMethod}}'.toUpperCase(), method: '{{httpMethod}}'.toUpperCase(),
headers: headerParams, 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();
}
}