ServiceStack& Swagger - ApiMember作为路径和查询

时间:2013-04-05 08:28:53

标签: servicestack swagger

我正在寻找以下问题的解决方案,关于ServiceStack中的Swagger集成。

我的RequestObject具有必需的Property Id。 我想提供以下路线:

[Route("/User/byId/{Id}", "GET", Summary = @"test", Notes = "test")]
[Route("/User/byId", "GET", Summary = @"test", Notes = "test")]

基本上,这应该选择在查询字符串中提供Id或者作为ServiceConsumer的路径。

Swagger UI正确显示2个路由,但两种方式都不可测试,因为API-Member Attribute不允许将其指定为ParameterType'path'或'query'。

来源:https://gist.github.com/JohannesFerner/5317496

有没有办法,提供API-Member规范,特别是相应的Route,或者定义它是valdid作为路径和查询?

像这样:

[ApiMember(Name = "Id", ParameterType="path,query", Description = "User Id",  DataType = "int", IsRequired = true)]

2 个答案:

答案 0 :(得分:2)

在这种情况下,我发现最简单的方法是创建两个单独的DTO类,以便在Swagger中正确记录每个路径。 DTO类可能具有相同的属性(在这种情况下为Id,看起来像),以及不同的RouteApiMember属性。您将拥有两个服务方法,每个DTO一个,并且可以调用共享方法,传入Id属性的值,这样就不会重复实现大部分实现。

答案 1 :(得分:1)

您可以多次提供ApiMember。所以扩展你的榜样:

[Route("/User/byId/{Id}", "GET", Summary = @"test", Notes = "test")]
[Route("/User/byId", "GET", Summary = @"test", Notes = "test")]
public class TestRoute
{
    [ApiMember(Name = "Id", ParameterType="path", Description = "User Id",  DataType = "int", IsRequired = false)]
    [ApiMember(Name = "Id", ParameterType="query", Description = "User Id",  DataType = "int", IsRequired = false)]
    public int Id { get; set; }
}

这当然导致两个路由的规范,都接受id查询参数或路径参数。

如果你使用swagger-codegen,那么很遗憾会创建一个如下所示的调用:

public GetTestId(int Id1, int Id2 = null)