【问题标题】:WebApi 2 routing with ? or /WebApi 2 路由与?或者 /
【发布时间】:2018-11-26 17:22:29
【问题描述】:

我刚刚在我的 api 中添加了 swagger 以生成一些文档...

通常,我的前端代码会像这样“通过 id 获取”:

https://whatever.com/api/GetDisplayContainer/A90555CD-931E-4D9D-D51D-08D63E83FCC6

然而,大摇大摆的“试试看”想要发送:

https://whatever.com/api/GetDisplayContainer?id=A90555CD-931E-4D9D-D51D-08D63E83FCC6

我希望能够同时支持这两种方式。我该怎么做?

这里是一个控制器方法的例子:

[HttpGet]
[Route("GetDisplayContainer")]
public ApiResponse<ContainerDisplayViewModel> GetDisplayContainer(Guid id)
{
    return ApiResponse.Convert(ResourceService, _containerService.GetDisplayContainerById(id));
}

我真的不想改变我现有的代码来以“查询字符串”的方式来做。因为它是一种完全有效的方式。但如果能够同时支持这两者就太好了……

这是使用 .net core 2.1 的 C#。

谢谢!

【问题讨论】:

  • 如果您将路线设置为“GetDisplayContainer/{id}”,那么 swagger 可能会建议您想要的格式
  • 这行得通 - 谢谢!如果您建议将其作为答案,我会将其标记为已接受..
  • 500 错误是怎么回事?
  • 我意识到这是由于没有有效的会话造成的,一旦我登录它就可以通过 swagger ui 按预期工作,所以这是一个红鲱鱼......

标签: c# routes query-string asp.net-core-webapi


【解决方案1】:

你可以做两条路线:

[HttpGet]
[Route("GetDisplayContainer")]
public ApiResponse<ContainerDisplayViewModel> GetDisplayContainer([FromQuery] Guid id)
{
}

[HttpGet]
[Route("GetDisplayContainer/{id}")]
public ApiResponse<ContainerDisplayViewModel> GetDisplayContainerRoute([FromRoute] Guid id)
{
}

【讨论】:

  • 所以唯一的方法是复制每个带参数的 get 方法?这似乎有点糟糕......
  • 是的,如果您必须走多条路线,这并不理想。我很高兴其他解决方案奏效了!
【解决方案2】:

如果您将路由从 GetDisplayContainer 更改为 GetDisplayContainer/{id},则 Swagger 将知道该参数不在查询字符串中,并且应该生成您想要的输出。

完整代码:

[HttpGet]
[Route("GetDisplayContainer/{id}")]
public ApiResponse<ContainerDisplayViewModel> GetDisplayContainer(Guid id)
{
    return ApiResponse.Convert(ResourceService, _containerService.GetDisplayContainerById(id));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2015-09-09
    • 2017-07-21
    • 1970-01-01
    • 2014-03-25
    • 2017-06-26
    相关资源
    最近更新 更多