如何在ASP.NET中使用Fast Endpoints实现GET请求?
解决Fast Endpoints中GET请求Swagger生成请求体的问题
问题根源在于Fast Endpoints默认会将泛型Endpoint<TRequest, TResponse>中的TRequest作为请求体绑定,而HTTP规范中GET/HEAD请求不应携带请求体,这导致Swagger生成了不符合规范的请求结构,最终触发浏览器fetch API的错误。
针对你的场景,分两种情况修正:
1. 无查询参数的场景
直接将请求类型替换为Fast Endpoints提供的EmptyRequest,这样框架就不会生成请求体:
using api.Blogs.Shared; using api.Data; using AutoMapper; using FastEndpoints; using Microsoft.EntityFrameworkCore; namespace api.Blogs.ListBlogsEndpoint; public class ListBlogsEndpoint(BlogDbContext context, AutoMapper.IMapper mapper) : Endpoint<EmptyRequest, BlogResponse[]> { public override void Configure() { Get("blogs"); } public override async Task HandleAsync(EmptyRequest req, CancellationToken ct) { var blogs = await context.Blogs.ToArrayAsync(ct); var response = blogs.Select(b => mapper.Map<BlogResponse>(b)).ToArray(); await SendOkAsync(response, ct); } }
2. 需要查询参数的场景(如分页、筛选)
如果你的ListBlogsRequest是用来接收查询参数的,需要给类的属性标记[QueryParam],并在配置中显式允许查询参数绑定:
首先修改请求类:
using FastEndpoints; public class ListBlogsRequest { [QueryParam] public int? Page { get; set; } [QueryParam] public int? PageSize { get; set; } [QueryParam] public string? SearchKeyword { get; set; } }
然后更新Endpoint配置:
public override void Configure() { Get("blogs"); AllowQueryParams(); // 显式声明使用查询参数绑定 }
这样Fast Endpoints会自动将请求参数解析为URL查询参数,Swagger也会生成对应的查询参数输入框,而非请求体,完全符合HTTP规范。
内容的提问来源于stack exchange,提问作者Mohammad Zohar
相关产品推荐
相关产品推荐

