From d722c05c4da569ddc6662124e71c19fb82ab0f25 Mon Sep 17 00:00:00 2001 From: Bazni Date: Tue, 21 Apr 2026 17:56:34 +0800 Subject: [PATCH 1/2] [dart-dio] Fix `json_serializable` serialize template to support `hasFormParams` The `json_serializable` dart-dio serialize template only handled `{{#bodyParam}}`, which meant operations using `application/x-www-form-urlencoded` or `multipart/form-data` produced an empty `try {}` block and a `_bodyData` that was never assigned. The request body was silently dropped. This mirrors the handling already present in the `built_value` template for the same generator, but without `built_value`-specific `encodeFormParameter` / `_serializers` calls since `json_serializable` passes values directly (consistent with its `query_param.mustache`). - `application/x-www-form-urlencoded` -> `Map` - `multipart/form-data` -> `FormData.fromMap({...})` - Optional / non-required + non-nullable params are conditionally included with `if (paramName != null)`. - The existing `bodyParam` branch is preserved, just properly indented (to match `built_value`). --- .../json_serializable/api/serialize.mustache | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/json_serializable/api/serialize.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/json_serializable/api/serialize.mustache index 93aed695e980..6cfeff6703a5 100644 --- a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/json_serializable/api/serialize.mustache +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/json_serializable/api/serialize.mustache @@ -1 +1,19 @@ -{{#bodyParam}}_bodyData=jsonEncode({{{paramName}}});{{/bodyParam}} \ No newline at end of file + {{#hasFormParams}} + {{#isMultipart}} + _bodyData = FormData.fromMap({ + {{#formParams}} + {{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{#isFile}}{{{paramName}}}{{#isArray}}.toList(){{/isArray}}{{/isFile}}{{^isFile}}{{{paramName}}}{{/isFile}}, + {{/formParams}} + }); + {{/isMultipart}} + {{^isMultipart}} + _bodyData = { + {{#formParams}} + {{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{{paramName}}}, + {{/formParams}} + }; + {{/isMultipart}} + {{/hasFormParams}} + {{#bodyParam}} + _bodyData = jsonEncode({{{paramName}}}); + {{/bodyParam}} From 23b1b94d5fa6e7b2c9e30311418b0332216b5a54 Mon Sep 17 00:00:00 2001 From: Bazni Date: Tue, 21 Apr 2026 17:56:34 +0800 Subject: [PATCH 2/2] [dart-dio] Update samples after `json_serializable` form-param fix Regenerates the `petstore_client_lib_fake-json_serializable` sample via `./bin/generate-samples.sh bin/configs/dart-dio*` to reflect the updated `serialize.mustache` template. Previously empty `try {}` blocks in operations using `application/x-www-form-urlencoded` or `multipart/form-data` (e.g. `updatePetWithForm`, `uploadFile`, `testEndpointParameters`, `testEnumParameters`, `testQueryParameterCollectionFormat`) now correctly populate `_bodyData`. Existing body-param operations are regenerated with consistent indentation. --- .../lib/src/api/another_fake_api.dart | 3 +- .../lib/src/api/fake_api.dart | 69 +++++++++++++++---- .../src/api/fake_classname_tags123_api.dart | 3 +- .../lib/src/api/pet_api.dart | 18 ++++- .../lib/src/api/store_api.dart | 3 +- .../lib/src/api/user_api.dart | 12 ++-- 6 files changed, 84 insertions(+), 24 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/another_fake_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/another_fake_api.dart index 20e0f8da9464..80243cc5957a 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/another_fake_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/another_fake_api.dart @@ -57,7 +57,8 @@ class AnotherFakeApi { dynamic _bodyData; try { -_bodyData=jsonEncode(modelClient); + _bodyData = jsonEncode(modelClient); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_api.dart index 95e28581f213..370401906dcd 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_api.dart @@ -293,7 +293,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'bool' dynamic _bodyData; try { -_bodyData=jsonEncode(outerComposite); + _bodyData = jsonEncode(outerComposite); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -540,7 +543,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'num', g dynamic _bodyData; try { -_bodyData=jsonEncode(body); + _bodyData = jsonEncode(body); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -720,7 +725,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'S dynamic _bodyData; try { -_bodyData=jsonEncode(outerObjectWithEnumProperty); + _bodyData = jsonEncode(outerObjectWithEnumProperty); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -810,7 +816,8 @@ _responseData = rawData == null ? null : deserialize(r dynamic _bodyData; try { + _bodyData = { + if (integer != null) r'integer': integer, + if (int32 != null) r'int32': int32, + if (int64 != null) r'int64': int64, + r'number': number, + if (float != null) r'float': float, + r'double': double_, + if (string != null) r'string': string, + r'pattern_without_delimiter': patternWithoutDelimiter, + r'byte': byte, + if (binary != null) r'binary': binary, + if (date != null) r'date': date, + if (dateTime != null) r'dateTime': dateTime, + if (password != null) r'password': password, + if (callback != null) r'callback': callback, + }; } catch(error, stackTrace) { throw DioException( @@ -1291,6 +1318,10 @@ _responseData = rawData == null ? null : deserialize(r dynamic _bodyData; try { + _bodyData = { + if (enumFormStringArray != null) r'enum_form_string_array': enumFormStringArray, + if (enumFormString != null) r'enum_form_string': enumFormString, + }; } catch(error, stackTrace) { throw DioException( @@ -1431,7 +1462,8 @@ _responseData = rawData == null ? null : deserialize(r dynamic _bodyData; try { -_bodyData=jsonEncode(requestBody); + _bodyData = jsonEncode(requestBody); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -1496,7 +1528,8 @@ _bodyData=jsonEncode(requestBody); dynamic _bodyData; try { -_bodyData=jsonEncode(testInlineFreeformAdditionalPropertiesRequest); + _bodyData = jsonEncode(testInlineFreeformAdditionalPropertiesRequest); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -1563,6 +1596,10 @@ _bodyData=jsonEncode(testInlineFreeformAdditionalPropertiesRequest); dynamic _bodyData; try { + _bodyData = { + r'param': param, + r'param2': param2, + }; } catch(error, stackTrace) { throw DioException( @@ -1628,7 +1665,8 @@ _bodyData=jsonEncode(testInlineFreeformAdditionalPropertiesRequest); dynamic _bodyData; try { -_bodyData=jsonEncode(childWithNullable); + _bodyData = jsonEncode(childWithNullable); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -1763,7 +1801,8 @@ _bodyData=jsonEncode(childWithNullable); dynamic _bodyData; try { -_bodyData=jsonEncode(requestBody); + _bodyData = jsonEncode(requestBody); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_classname_tags123_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_classname_tags123_api.dart index 85fbbac9287b..6fc587cd1244 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_classname_tags123_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/fake_classname_tags123_api.dart @@ -64,7 +64,8 @@ class FakeClassnameTags123Api { dynamic _bodyData; try { -_bodyData=jsonEncode(modelClient); + _bodyData = jsonEncode(modelClient); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/pet_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/pet_api.dart index aab8df518913..60aaece86905 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/pet_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/pet_api.dart @@ -63,7 +63,8 @@ class PetApi { dynamic _bodyData; try { -_bodyData=jsonEncode(pet); + _bodyData = jsonEncode(pet); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -432,7 +433,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'Pet', g dynamic _bodyData; try { -_bodyData=jsonEncode(pet); + _bodyData = jsonEncode(pet); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -506,6 +508,10 @@ _bodyData=jsonEncode(pet); dynamic _bodyData; try { + _bodyData = { + if (name != null) r'name': name, + if (status != null) r'status': status, + }; } catch(error, stackTrace) { throw DioException( @@ -580,6 +586,10 @@ _bodyData=jsonEncode(pet); dynamic _bodyData; try { + _bodyData = FormData.fromMap({ + if (additionalMetadata != null) r'additionalMetadata': additionalMetadata, + if (file != null) r'file': file, + }); } catch(error, stackTrace) { throw DioException( @@ -679,6 +689,10 @@ _responseData = rawData == null ? null : deserialize(r dynamic _bodyData; try { + _bodyData = FormData.fromMap({ + if (additionalMetadata != null) r'additionalMetadata': additionalMetadata, + r'requiredFile': requiredFile, + }); } catch(error, stackTrace) { throw DioException( diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/store_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/store_api.dart index f81b521ed418..272e45a0ef6c 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/store_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/store_api.dart @@ -253,7 +253,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'Ord dynamic _bodyData; try { -_bodyData=jsonEncode(order); + _bodyData = jsonEncode(order); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/user_api.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/user_api.dart index 85583331abe7..87ceeccc6b4a 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/user_api.dart +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake-json_serializable/lib/src/api/user_api.dart @@ -57,7 +57,8 @@ class UserApi { dynamic _bodyData; try { -_bodyData=jsonEncode(user); + _bodyData = jsonEncode(user); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -122,7 +123,8 @@ _bodyData=jsonEncode(user); dynamic _bodyData; try { -_bodyData=jsonEncode(user); + _bodyData = jsonEncode(user); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -187,7 +189,8 @@ _bodyData=jsonEncode(user); dynamic _bodyData; try { -_bodyData=jsonEncode(user); + _bodyData = jsonEncode(user); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose( @@ -498,7 +501,8 @@ _responseData = rawData == null ? null : deserialize(rawData, 'S dynamic _bodyData; try { -_bodyData=jsonEncode(user); + _bodyData = jsonEncode(user); + } catch(error, stackTrace) { throw DioException( requestOptions: _options.compose(