ServiceStack Swagger 主体

ServiceStack Swagger body

我正在努力让 Swagger 正确呈现我的 ServiceStack 服务。

我希望看到一个 UserId 字符串作为表单参数,一个 PrivateCustomer 对象作为主体参数,但是尽管 UserId 也作为一个单独的输入字段出现,但仍继续获取包含 UserId 和 PrivateCustomer 的主体参数。

这是我的代码:

这是 Swagger 中的结果:

如何去掉正文中的UserId?

非常感谢!

[Api*] 注释仅用于记录您的 API,它们不会影响您的 API 的行为,例如请求主体始终是整个 Request DTO,您不能同时发送 "form" 和 "body" 参数类型,即只有 1 个请求主体并且使用 "form" 只会发送表单变量。

如果您想将它们分开,您可以将 UserId 添加到查询字符串中,并使用以下命令将它们排除在模型模式之外:

[Route("/CreatePrivateCustomer", "POST")]
public class CreatePrivateCustomerRequest
{
    [ApiMember(IsRequired = true, ParameterType = "query", ExcludeInSchema = true)]
    public string UserId { get; set; }

    [ApiMember(IsRequired = true, ParameterType = "model")]
    public PrivateCustomer Customer { get; set; }
}

这将把变量分开,在queryString中发送UserId,在Request Body中发送DTO的请求为JSON,例如:

POST /CreatePrivateCustomer?UserId=1
Content-Type: application/json

{"Customer":{"CustomerNumber":1,...}}

尽管通常如果您希望将必需参数与请求正文分开,您会将它们放在路径中,例如:

[Route("/CreatePrivateCustomer/{UserId}", "POST")]
public class CreatePrivateCustomerRequest
{
    [ApiMember(IsRequired = true, ParameterType = "path", ExcludeInSchema = true)]
    public string UserId { get; set; }

    [ApiMember(IsRequired = true, ParameterType = "model")]
    public PrivateCustomer Customer { get; set; }
}

如果您不想嵌套 PrivateCustomer 属性,您可以将它们直接添加到 Request DTO 中,例如:

[Route("/CreatePrivateCustomer/{UserId}", "POST")]
public class CreatePrivateCustomerRequest
{
    [ApiMember(IsRequired = true, ParameterType = "path", ExcludeInSchema = true)]
    public string UserId { get; set; }

    public int CustomerNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}