如何在 API 端点 .NET Core 上添加后缀

How to add suffix on API Endpoints .NET Core

有没有办法在所有端点路由上自动添加后缀,例如 .json.

v1/users.json
v1/users/{id}.json

到目前为止我尝试的是创建一个如下所示的 BaseController

[ApiController]
[Route("v1/[controller].json")]
public class BaseController : ControllerBase
{
}

但每次我将它用于我的控制器时,它看起来像这样

v1/users.json
v1/users.json/{id}

您可以向实际端点而不是控制器添加额外路由

[ApiController]
[Route("v1/[controller]")]
public class BaseController : ControllerBase
{
    [HttpGet(".json")]
    public IActionResult Get()
    {
    
    }
    
    // Without Route Parameters
    [HttpGet("{id}.json")]
    public IActionResult Get([FromRoute] int id)
    {
          ...
    }

    // With Route and Query Parameters
    [HttpGet("{id}.json/friend")]
    public IActionResult Get([FromRoute]int id,[FromQuery] string friendName)
    {
          ...
    }

    // With Route and Query Parameters and Body
    [HttpPost("{id}.json/friends")]
    public IActionResult Get([FromRoute]int id,[FromQuery] string message, [FromBody]IFilter filter)
    {
          ...
    }
}

您可以使用 URL 重写中间件来接受带有 .json 的 URLs,然后简单地删除它。所以像:

/api/users/123/picture.json?query=123

会变成:

/api/users/123/picture?query=123

您可以通过将以下代码添加到 Startup 的 Configure 方法中来完成此操作:

var rewriteOptions = new RewriteOptions()
    .AddRewrite(@"^(.*?)(?:\.json)(\?.*)?$", "");
app.UseRewriter(rewriteOptions);

有关详细信息,请参阅 docs

警告:如果您使用 Url.Action(...) 等在代码中生成 URL,则它不会包含 .json。重写仅影响传入请求。