2013-03-20 2 views
2

У меня есть простой объект сеанса, который выглядит как этотСваггер с ServiceStack не отправляет элементы сервера на POST

[Route("/Session", Summary = "Creates a security session", Notes = "Some session related notes here")] 
public class Session : IReturn<SessionResponse> 
{ 
    [ApiMember(Name = "DomainName", Description = "The Security Domain", ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string DomainName { get; set; } 

    [ApiMember(Name = "UserName", Description = "The User Name", ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string UserName { get; set; } 

    [ApiMember(Name = "Password", Description = "The password", ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string Password { get; set; } 
} 

Когда я иду в развязность интерфейс я могу видеть элементы

Однако, когда я вхожу элемент и нажмите «Попробовать» сейчас, я вижу, что содержимое запроса не отправляется на сервер.

Я правильно настроил свой poco с параметром Type = "path" или мне нужно делать что-то еще здесь? Пожалуйста, порекомендуйте.

ответ

1

Я правильно настроил свой poco с параметром Type = "path" или мне нужно делать что-то еще здесь?

Я так не считаю. Настройка каждого из ваших свойств сеанса на ParameterType='path' предполагает, что вы хотите, чтобы каждое свойство было переменным/полем с указанием пути/URL (документация here). Поэтому вы хотите, чтобы ваш маршрут ServiceStack выглядел примерно так, если вы хотите использовать «путь».

[Route("/Session/{DomainName}/{UserName}/{Password}"] 

Для меня «запрос» или «тело» будет лучшим выбором. Также This might contain useful information as well.

+0

Я получил это для работы ... вот что мне нужно было – user2192546

1

я получил эту работу, вот то, что я должен был сделать

[Route("/Session", "POST", Summary = "Creates a security session", Notes = "Some session related notes here")] 
public class Session : IReturn<SessionResponse> 
{ 
    [ApiMember(Name = "SessionData", Description = "The Session Data", ParameterType = "body", DataType = "SessionData", IsRequired = true)] 
    public string DomainName { get; set; } 

    //[ApiMember(Name = "UserName", Description = "The User Name", ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string UserName { get; set; } 

    //[ApiMember(Name = "Password", Description = "The password", ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string Password { get; set; } 
} 

Так что теперь я получаю окно области текста, и мне нужно, чтобы войти в JSON для всего объекта сеанса, так что DomainName, UserName и пароль передаются, но почему-то это не кажется правильным.

1

Для поддержки отправки данных в теле запроса с текущей реализацией Swagger в ServiceStack, вы должны иметь ровно один ApiMember с ParameterType = "body" (вы все еще можете иметь другое ApiMember атрибутов с другими другими значениями ParameterType, если у вас есть переменные в URL например).

ApiMember с ParameterType = "body" будет представлять весь контент вашего тела запроса. На самом деле не имеет значения, какое свойство вашего запроса DTO вы украшаете этим атрибутом. Мы делаем что-то вроде этого, чтобы было ясно в Swagger UI, что textarea создан для этой ApiMember следует использовать для заполнения всего тела запроса:

[ApiMember(Name = "RequestBody", ParameterType = "body", IsRequired = true, 
    Description = SomeLongStringConstantThatDescribesTheEntireDTO] 

В Swagger UI, это будет отображать textarea, вы будете необходимо ввести весь DTO как JSON в этой текстовой области. В вашем случае, это было бы что-то вроде:

{"DomainName": "...", "UserName": "...", "Password": "..."} 
+1

Обратите внимание, что этот ответ, хотя и был актуальным в то время, был опубликован, теперь применим только к более ранним версиям ServiceStack v3.Последние версии ServiceStack, как v3, так и v4, значительно улучшили интеграцию Swagger, включая автоматический запрос тела запроса без необходимости использования явных атрибутов ApiMember. –

1

Предпринимались ли обновление на получение этого, чтобы работать, не видя ваших параметров пути в определении параметров тела?

[Route("https://stackoverflow.com/users/{UserId}/races", "POST", Summary = "Associates a race with a user")] 
public class AddUserRace : IReturnVoid 
{ 
    [ApiMember(Description = "User Id to associate a race with to", ParameterType = "path", Verb="POST", DataType = "int", IsRequired = true)] 
    public int UserId { get; set; } 
    [Description("Race Id of race to associate with user")] 
    public int RaceId { get; set; } 
} 

Swagger UI Result

В идеале, так как UserId это путь пары, я хочу это скрыто от тела DTO.