@@ -30,6 +30,7 @@ import io.openapiprocessor.core.model.Response as ModelResponse
3030import io.openapiprocessor.core.model.parameters.Parameter as ModelParameter
3131
3232const val MULTIPART = " multipart/"
33+ const val URLENCODED = " application/x-www-form-urlencoded"
3334const val INTERFACE_DEFAULT_NAME = " "
3435
3536/* *
@@ -236,8 +237,12 @@ class ApiConverter(
236237 mediaType.getSchema(),
237238 ctx.resolver)
238239
239- if (contentType.startsWith( MULTIPART )) {
240+ if (isMultipart(contentType )) {
240241 params.addAll(createMultipartParameter(info, mediaType.encodings, ctx.dataTypes))
242+
243+ } else if (isUrlencoded(contentType)) {
244+ params.addAll(createFormParameter(info, ctx.dataTypes))
245+
241246 } else {
242247 bodies.add (createRequestBody (contentType, info, requestBody, ctx.dataTypes))
243248 }
@@ -246,6 +251,10 @@ class ApiConverter(
246251 return RequestBodies (bodies, params)
247252 }
248253
254+ private fun isMultipart (contentType : String ): Boolean = contentType.startsWith(MULTIPART )
255+
256+ private fun isUrlencoded (contentType : String ): Boolean = contentType.startsWith(URLENCODED )
257+
249258 private fun collectResponses (responses : Map <HttpStatus , Response >, ctx : ApiConverterContext ): Map <ModelHttpStatus , List <ModelResponse >> {
250259 val resultResponses: MutableMap <HttpStatus , List <ModelResponse >> = mutableMapOf ()
251260 val contentTypeInterfaces = collectContentTypeInterfaces(responses, ctx)
@@ -274,7 +283,7 @@ class ApiConverter(
274283 // to check if a response marker interface is wanted it is necessary to know if the responses have the same
275284 // result data type. In case they have the same data type we do not need the marker interface.
276285 //
277- // Unfortunately we have to calculate the result data types to achieve this because it is currently not possible
286+ // Unfortunately, we have to calculate the result data types to achieve this because it is currently not possible
278287 // to detect this from the parsed OpenAPI.
279288
280289 val checkResponses: MutableMap <ModelHttpStatus , List <ModelResponse >> = mutableMapOf ()
@@ -390,8 +399,21 @@ class ApiConverter(
390399 val parameters = mutableListOf<ModelParameter >()
391400 dataType.forEach { property, propertyDataType ->
392401 val mpp = MultipartParameter (property, encodings[property]?.contentType)
393- val parameter = framework.createMultipartParameter(mpp, propertyDataType)
394- parameters.add(parameter)
402+ parameters.add(framework.createMultipartParameter(mpp, propertyDataType))
403+ }
404+ return parameters
405+ }
406+
407+ private fun createFormParameter (info : SchemaInfo , dataTypes : DataTypes ): Collection <ModelParameter > {
408+ val dataType = convertDataType(info, dataTypes)
409+ if (dataType !is ObjectDataType ) {
410+ throw NoRequestBodySchemaException (info.getPath())
411+ }
412+
413+ dataTypes.del(dataType)
414+ val parameters = mutableListOf<ModelParameter >()
415+ dataType.forEach { property, propertyDataType ->
416+ parameters.add(framework.createQueryParameter(UrlencodedParameter (property), propertyDataType))
395417 }
396418 return parameters
397419 }
0 commit comments