ServiceStack Swagger body - PullRequest
       7

ServiceStack Swagger body

0 голосов
/ 03 ноября 2018

Я изо всех сил пытаюсь, чтобы Swagger правильно представил свой сервис ServiceStack.

Я хотел бы видеть строку UserId в качестве параметра формы и объект PrivateCustomer в качестве параметра body, но продолжаю получать параметр body с ОБА и UserId и PrivateCustomer, несмотря на то, что UserId также отображается в качестве отдельного поля ввода.

Вот мой код: enter image description here

А вот результат в Swagger: enter image description here

Как мне избавиться от UserId в теле?

Большое спасибо!

1 Ответ

0 голосов
/ 03 ноября 2018

Аннотации [Api*] предназначены только для документирования вашего API, они не влияют на поведение вашего API, например, тело запроса всегда должно быть полным DTO запроса, и вы не можете одновременно отправлять типы параметров «форма» и «тело», т. е. имеется только 1 тело запроса, а при использовании «формы» только переменные формы будет отправлен.

Если вы хотите разделить их, вы можете добавить 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; }
}

Это разделит переменные и отправит UserId в queryString и запрос 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 были вложенными, вы добавили бы их непосредственно в запрос 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; }
}
...