azure-functions-openapi-extension icon indicating copy to clipboard operation
azure-functions-openapi-extension copied to clipboard

Error generating swagger when using JsonProperty in class

Open MatsVivanco opened this issue 3 years ago • 1 comments

Describe the issue When using [OpenApiRequestBody("application/json", typeof(CatInfo), Description = "See schema", Required = true)] with class object

    {
        [FunctionName("HelloCatFunction")]
        [OpenApiOperation(operationId: "Run", tags: new[] { "name" })]
        [OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", In = OpenApiSecurityLocationType.Query)]
        [OpenApiParameter(name: "name", In = ParameterLocation.Path, Required = true, Type = typeof(string), Description = "The **Name** parameter")]
        [OpenApiRequestBody("application/json", typeof(CatInfo), Description = "See schema", Required = true)]
        [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "application/json", bodyType: typeof(CatFuture), Description = "The OK response")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = "cat/future/{name}")] HttpRequest req, string name,
            ILogger log)
        {
            log.LogInformation($"Predict future for cat {name}");
            try
            {
                var requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                var catInformation = JsonConvert.DeserializeObject<CatInfo>(requestBody);
                if (catInformation == null) return new BadRequestResult();
                var futurePrediction = new CatFuture()
                {
                    Name = catInformation.Name,
                    Age = catInformation.Age,
                    FuturePrediction = Prediction()
                };
                return new OkObjectResult(futurePrediction);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
using Newtonsoft.Json;

namespace Cat.Api
{
    public class CatFuture
    {
        [JsonProperty(propertyName: nameof(Name))]
        public string? Name { get; set; }
        [JsonProperty(propertyName: nameof(Age))]
        public int? Age { get; set; }
        [JsonProperty(propertyName: nameof(FuturePrediction))]
        public string FuturePrediction { get; set; }
    }
}

Swagger ui fails to load image

To Reproduce Steps to reproduce the behavior:

  1. Create a Azure function using .net core 3.1
  2. Creata a simple httptrigger and add OpenApiRequestBody (Im using nuget Microsoft.Azure.WebJobs.Extensions.OpenApi version 1.0.0)
  3. Add a class and use newtonsoft: JsonProperty(propertyName: nameof(Name))] Like the class above. Then add the object in typeof() in OpenApiRequestBody
  4. See error

Expected behavior Should work.

Screenshots If applicable, add screenshots to help explain your issue.

Environment (please complete the following information, if applicable):

  • Azure function . net core 3.1
  • Microsoft Visual Studio Professional 2019 Version 16.11.3
  • Browser Chrome - Version 96.0.4664.45
  • nuget Microsoft.Azure.WebJobs.Extensions.OpenApi version 1.0.0

Additional context Add any other context about the problem here.

MatsVivanco avatar Nov 23 '21 14:11 MatsVivanco

Take a look at #181 @MatsVivanco , this may solve your problem!

jackbatzner avatar Apr 29 '22 19:04 jackbatzner