Hi
For a simple test project i created a REST-api with only some endpoints. But when adding this REST-api into AppBuilder the endpoints "Employees" are visible but not selectable - they are grey and looks disabled:
swagger-definition:
{ openapi: "3.0.1", info: { title: "FullStack.API", version: "1.0" }, paths: { /api/Employees: { get: { tags: [ "Employees" ], responses: { 200: { description: "Success" } } }, post: { tags: [ "Employees" ], requestBody: { content: { application/json: { schema: { $ref: "#/components/schemas/Employee" } }, text/json: { schema: { $ref: "#/components/schemas/Employee" } }, application/*+json: { schema: { $ref: "#/components/schemas/Employee" } } } }, responses: { 200: { description: "Success" } } } }, /api/Employees/{id}: { get: { tags: [ "Employees" ], parameters: [ { name: "id", in: "path", required: true, schema: { type: "string", format: "uuid" } } ], responses: { 200: { description: "Success" } } }, put: { tags: [ "Employees" ], parameters: [ { name: "id", in: "path", required: true, schema: { type: "string", format: "uuid" } } ], requestBody: { content: { application/json: { schema: { $ref: "#/components/schemas/Employee" } }, text/json: { schema: { $ref: "#/components/schemas/Employee" } }, application/*+json: { schema: { $ref: "#/components/schemas/Employee" } } } }, responses: { 200: { description: "Success" } } }, delete: { tags: [ "Employees" ], parameters: [ { name: "id", in: "path", required: true, schema: { type: "string", format: "uuid" } } ], responses: { 200: { description: "Success" } } } }, /api/TzGemeinden: { get: { tags: [ "TzGemeinden" ], responses: { 200: { description: "Success" } } } }, /WeatherForecast: { get: { tags: [ "WeatherForecast" ], operationId: "GetWeatherForecast", responses: { 200: { description: "Success", content: { text/plain: { schema: { type: "array", items: { $ref: "#/components/schemas/WeatherForecast" } } }, application/json: { schema: { type: "array", items: { $ref: "#/components/schemas/WeatherForecast" } } }, text/json: { schema: { type: "array", items: { $ref: "#/components/schemas/WeatherForecast" } } } } } } } } }, components: { schemas: { Employee: { type: "object", properties: { id: { type: "string", format: "uuid" }, name: { type: "string", nullable: true }, email: { type: "string", nullable: true }, phone: { type: "integer", format: "int64" }, salary: { type: "integer", format: "int64" }, department: { type: "string", nullable: true } }, additionalProperties: false }, WeatherForecast: { type: "object", properties: { date: { type: "string", format: "date-time" }, temperatureC: { type: "integer", format: "int32" }, temperatureF: { type: "integer", format: "int32", readOnly: true }, summary: { type: "string", nullable: true } }, additionalProperties: false } } } }
Any idea whats going wrong here?
Thanks for any support.
br, Robert
Haha. Glad to have helped you.
Cheers
Bingo!! It works!! Pablo if we should ever meet I owe you an obscene amount of alcohol!! In the meantime, please accept my sincere thanks at spending the time to walk me through this with my, still limited, knowledge of C#. Having this problem, and then your advice has actually taught me a lot. Many thanks.
Anthony
Anthony Marler said:This resource contains a single object" indicates my Produces isn't right I guess?
Yes, since you're trying to return a collection, your type should describe some type of collection or enumerable.
e.g. .Produces<IEnumerable<PersonModel>>()
Thanks for continuing to help me. Getting there now. Here is the code and I am now returning a PersonModel using Produces statement.
This still works with Swagger
And in AppBuilder almost but...
Then I can't bind to the grid as now options sow against the source. "This resource contains a single object" indicates my Produces isn't right I guess?
PS. It's early hours of the morning here so I'll pick this up tomorrow. Thanks again.
Anthony,
It's not about App Builder supporting IResult, it's about feeding Swagger with information to properly describe the response type.
e.g.
When using IResult with no additional information this area will be empty.
Anthony Marler said:Even if I change the return Results.OK(...) to return TypedResults.OK(...) app builder stays greyed out I suspect because the PersonGetAll() function returns a Task<IResult>
If you only return OK results, then change it to Task<Ok<YourResponseType>> like in the docs:
public static async Task<Ok<Todo[]>> GetAllTodos(TodoGroupDbContext database) { var todos = await database.Todos.ToArrayAsync(); return TypedResults.Ok(todos); }
If you need to keep IResult, then you need to add a .Produces<>() statement:
Consider the following endpoint, for which a 400 BadRequest status code is returned when the orderId is greater than 999. Otherwise, it produces a 200 OK with the expected content. C# app.MapGet("/orders/{orderId}", IResult (int orderId) => orderId > 999 ? TypedResults.BadRequest() : TypedResults.Ok(new Order(orderId))) .Produces(400) .Produces<Order>();
I hope this helps.