From 39ba6bbfb17237b702ba9da62cfe54de1198044d Mon Sep 17 00:00:00 2001 From: Josh Burton Date: Thu, 2 Jan 2020 19:03:37 +1300 Subject: [PATCH] [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 --- .../languages/DartDioClientCodegen.java | 7 ++++ .../src/main/resources/dart-dio/api.mustache | 39 +++++++++++++------ .../main/resources/dart-dio/api_util.mustache | 18 +++++++++ 3 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/dart-dio/api_util.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java index f5e82b6c2b8..29c81b823ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java @@ -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 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); diff --git a/modules/openapi-generator/src/main/resources/dart-dio/api.mustache b/modules/openapi-generator/src/main/resources/dart-dio/api.mustache index d09a7674082..e25eb930e83 100644 --- a/modules/openapi-generator/src/main/resources/dart-dio/api.mustache +++ b/modules/openapi-generator/src/main/resources/dart-dio/api.mustache @@ -25,10 +25,9 @@ class {{classname}} { String path = "{{{path}}}"{{#pathParams}}.replaceAll("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}}; - // query params - Map queryParams = {}; - Map headerParams = Map.from(headers ?? {}); - Map formParams = {}; + Map queryParams = {}; + Map headerParams = Map.from(headers ?? {}); + dynamic bodyData; {{#headerParams}} headerParams["{{baseName}}"] = {{paramName}}; @@ -36,12 +35,29 @@ class {{classname}} { {{#queryParams}} queryParams["{{baseName}}"] = {{paramName}}; {{/queryParams}} - queryParams.removeWhere((key, value) => value == null); - headerParams.removeWhere((key, value) => value == null); - formParams.removeWhere((key, value) => value == null); + queryParams.removeWhere((key, value) => value == null); + headerParams.removeWhere((key, value) => value == null); - List contentTypes = [{{#consumes}} - "{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/consumes}}]; + List contentTypes = [{{#consumes}}"{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/consumes}}]; + + {{#hasFormParams}} + Map 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, diff --git a/modules/openapi-generator/src/main/resources/dart-dio/api_util.mustache b/modules/openapi-generator/src/main/resources/dart-dio/api_util.mustache new file mode 100644 index 00000000000..eedad9166fd --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-dio/api_util.mustache @@ -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(); + } +} \ No newline at end of file