private void AddPrimitiveParameter(string name, SwaggerOperation operation, ParameterInfo parameter, SwaggerGenerator swaggerGenerator) { var operationParameter = swaggerGenerator.CreatePrimitiveParameter(name, parameter); operationParameter.Kind = SwaggerParameterKind.Query; operationParameter.IsRequired = operationParameter.IsRequired || parameter.HasDefaultValue == false; operation.Parameters.Add(operationParameter); }
private void AddFileParameter(ParameterInfo parameter, bool isFileArray, SwaggerOperation operation, SwaggerGenerator swaggerGenerator) { var attributes = parameter.GetCustomAttributes().ToList(); // TODO: Check if there is a way to control the property name var operationParameter = swaggerGenerator.CreatePrimitiveParameter(parameter.Name, parameter.GetXmlDocumentation(), parameter.ParameterType, attributes); InitializeFileParameter(operationParameter, isFileArray); operation.Parameters.Add(operationParameter); }
private void AddPrimitiveParametersFromUri(string name, SwaggerOperation operation, ParameterInfo parameter, JsonObjectTypeDescription typeDescription, SwaggerGenerator swaggerGenerator) { if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var operationParameter = swaggerGenerator.CreatePrimitiveParameter(name, parameter.GetXmlDocumentation(), parameter.ParameterType.GetEnumerableItemType(), parameter.GetCustomAttributes().ToList()); operationParameter.Kind = SwaggerParameterKind.Query; operationParameter.CollectionFormat = SwaggerParameterCollectionFormat.Multi; operation.Parameters.Add(operationParameter); } else { foreach (var property in parameter.ParameterType.GetRuntimeProperties()) { var attributes = property.GetCustomAttributes().ToList(); var fromQueryAttribute = attributes.SingleOrDefault(a => a.GetType().Name == "FromQueryAttribute"); var propertyName = TryGetStringPropertyValue(fromQueryAttribute, "Name") ?? JsonPathUtilities.GetPropertyName(property, _settings.DefaultPropertyNameHandling); var operationParameter = swaggerGenerator.CreatePrimitiveParameter(propertyName, property.GetXmlSummary(), property.PropertyType, attributes); // TODO: Check if required can be controlled with mechanisms other than RequiredAttribute var parameterInfo = JsonObjectTypeDescription.FromType(property.PropertyType, attributes, _settings.DefaultEnumHandling); var isFileArray = IsFileArray(property.PropertyType, parameterInfo); if (parameterInfo.Type == JsonObjectType.File || isFileArray) { InitializeFileParameter(operationParameter, isFileArray); } else { operationParameter.Kind = SwaggerParameterKind.Query; } operation.Parameters.Add(operationParameter); } } }
private void AddPrimitiveParameter(string name, SwaggerOperation operation, ParameterInfo parameter, SwaggerGenerator swaggerGenerator) { var operationParameter = swaggerGenerator.CreatePrimitiveParameter(name, parameter); operationParameter.Kind = SwaggerParameterKind.Query; operationParameter.IsRequired = operationParameter.IsRequired || parameter.HasDefaultValue == false; operation.Parameters.Add(operationParameter); }
private void AddPrimitiveParametersFromUri(string name, SwaggerOperation operation, ParameterInfo parameter, JsonObjectTypeDescription typeDescription, SwaggerGenerator swaggerGenerator) { if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var operationParameter = swaggerGenerator.CreatePrimitiveParameter(name, parameter.GetXmlDocumentation(), parameter.ParameterType.GetEnumerableItemType(), parameter.GetCustomAttributes().ToList()); operationParameter.Kind = SwaggerParameterKind.Query; operationParameter.CollectionFormat = SwaggerParameterCollectionFormat.Multi; operation.Parameters.Add(operationParameter); } else { foreach (var property in parameter.ParameterType.GetRuntimeProperties()) { var attributes = property.GetCustomAttributes().ToList(); var fromQueryAttribute = attributes.SingleOrDefault(a => a.GetType().Name == "FromQueryAttribute"); var propertyName = TryGetStringPropertyValue(fromQueryAttribute, "Name") ?? JsonPathUtilities.GetPropertyName(property, _settings.DefaultPropertyNameHandling); var operationParameter = swaggerGenerator.CreatePrimitiveParameter(propertyName, property.GetXmlSummary(), property.PropertyType, attributes); // TODO: Check if required can be controlled with mechanisms other than RequiredAttribute var parameterInfo = JsonObjectTypeDescription.FromType(property.PropertyType, attributes, _settings.DefaultEnumHandling); var isFileArray = IsFileArray(property.PropertyType, parameterInfo); if (parameterInfo.Type == JsonObjectType.File || isFileArray) InitializeFileParameter(operationParameter, isFileArray); else operationParameter.Kind = SwaggerParameterKind.Query; operation.Parameters.Add(operationParameter); } } }
private void AddFileParameter(ParameterInfo parameter, bool isFileArray, SwaggerOperation operation, SwaggerGenerator swaggerGenerator) { var attributes = parameter.GetCustomAttributes().ToList(); // TODO: Check if there is a way to control the property name var operationParameter = swaggerGenerator.CreatePrimitiveParameter(parameter.Name, parameter.GetXmlDocumentation(), parameter.ParameterType, attributes); InitializeFileParameter(operationParameter, isFileArray); operation.Parameters.Add(operationParameter); }
/// <exception cref="InvalidOperationException">The operation has more than one body parameter.</exception> private void LoadParameters(SwaggerOperation operation, List <ParameterInfo> parameters, string httpPath, SwaggerGenerator swaggerGenerator) { // TODO: Also check other attributes (e.g. FromHeader, ...) // https://docs.asp.net/en/latest/mvc/models/model-binding.html#customize-model-binding-behavior-with-attributes foreach (var parameter in parameters.Where(p => p.ParameterType != typeof(CancellationToken) && p.GetCustomAttributes().All(a => a.GetType().Name != "FromServicesAttribute") && p.GetCustomAttributes().All(a => a.GetType().Name != "BindNeverAttribute"))) { var nameLower = parameter.Name.ToLowerInvariant(); if (httpPath.ToLowerInvariant().Contains("{" + nameLower + "}") || httpPath.ToLowerInvariant().Contains("{" + nameLower + ":")) // path parameter { var operationParameter = swaggerGenerator.CreatePrimitiveParameter(parameter.Name, parameter); operationParameter.Kind = SwaggerParameterKind.Path; operationParameter.IsNullableRaw = false; operationParameter.IsRequired = true; // Path is always required => property not needed operation.Parameters.Add(operationParameter); } else { var parameterInfo = JsonObjectTypeDescription.FromType(parameter.ParameterType, parameter.GetCustomAttributes(), Settings.DefaultEnumHandling); if (TryAddFileParameter(parameterInfo, operation, parameter, swaggerGenerator) == false) { // http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx // TODO: Add support for ModelBinder attribute dynamic fromBodyAttribute = parameter.GetCustomAttributes() .SingleOrDefault(a => a.GetType().Name == "FromBodyAttribute"); dynamic fromUriAttribute = parameter.GetCustomAttributes() .SingleOrDefault(a => a.GetType().Name == "FromUriAttribute" || a.GetType().Name == "FromQueryAttribute"); var bodyParameterName = TryGetStringPropertyValue(fromBodyAttribute, "Name") ?? parameter.Name; var uriParameterName = TryGetStringPropertyValue(fromUriAttribute, "Name") ?? parameter.Name; if (parameterInfo.IsComplexType) { if (fromBodyAttribute != null || (fromUriAttribute == null && Settings.IsAspNetCore == false)) { AddBodyParameter(bodyParameterName, parameter, operation, swaggerGenerator); } else { AddPrimitiveParametersFromUri(uriParameterName, operation, parameter, parameterInfo, swaggerGenerator); } } else { if (fromBodyAttribute != null) { AddBodyParameter(bodyParameterName, parameter, operation, swaggerGenerator); } else { AddPrimitiveParameter(uriParameterName, operation, parameter, swaggerGenerator); } } } } } if (operation.ActualParameters.Any(p => p.Type == JsonObjectType.File)) { operation.Consumes = new List <string> { "multipart/form-data" } } ; if (operation.ActualParameters.Count(p => p.Kind == SwaggerParameterKind.Body) > 1) { throw new InvalidOperationException("The operation '" + operation.OperationId + "' has more than one body parameter."); } }