Создает ли метод POST новый объект и возвращает идентификатор этого объекта в openapi 3.0.2?

Я понимаю, что метод POST в openapi 3.0.2 должен создавать новый объект и возвращать идентификатор этого объекта. Когда я добавляю дополнительный маршрут в GET или DELETE этого объекта по идентификатору, я получаю ошибку 404. Я не совсем знаю, почему это может быть.

Вот мой пост и методы получения:

/api/globalorderdays:
post:
  tags:
    - Setup Global Order Days
  summary: Allows user to add order days and holidays to multiple 
           sessions.
  requestBody:
    required: true
    description: put text here
    content:
      application/json:
        schema:
            $ref: '#/components/schemas/GlobalOrderSetupInfo'
  responses:
    201:
      description: Created
    400:
      description: Bad request
    401:
      description: Unauthorized

/api/globalorderdays/{Id}:
get:
  tags:
    - Setup Global Order Days
  summary: put text here
  parameters:
    - in: path
      name: Id
      required: true
      description: put text here
      schema:
        type: integer
        example:
  responses:
    200:
      description: Success
      content:
        application/json:
          schema:
              $ref: '#/components/schemas/GlobalOrderSetupInfo'
    400:
      description: Bad request
    401:
      description: Unauthorized

/api/globalorderdays/{Id}:
delete:
  tags:
    - Setup Global Order Days
  summary: Allows user to delete added order days
  parameters:
    - in: path
      name: Id
      required: true
      description: put text here
      schema:
        type: integer
        example:
  responses:
    204:
      description: Deleted
    400:
      description: Bad request
    401:
      description: Unauthorized

Вот компоненты:

GlobalOrderSetupInfo:
  description: 'Put Text Here'
  type: object
  properties:
    Id:
      type: integer
      nullable: true
    AvailableHolidayList:
      type: string
      nullable: true
    SelectedOrderHolidays:
      type: string
      nullable: true
    SelectedHolidays:
      type: string
      nullable: true
    OrderDays:
      type: string
      nullable: true
    NoOrderDays:
      type: string
      nullable: true
    AllSessionList:
      uniqueItems: false
      type: array
      items:
        $ref: '#/components/schemas/SessionInfoList'
    SessionIdString:
      type: string
      nullable: true

SessionInfoList:
  description: 'Put Text Here'
  type: object
  properties:
    Id:
      type: integer
      nullable: true
    SessionID:
      type: integer
      nullable: true
    Name:
      type: string
      nullable: true
    Type:
      type: string
    GroupName:
      type: string
    IsChecked:
      type: boolean
      default: false
    SetupID:
      type: string
      nullable: true

Я ожидаю, что смогу получить/удалить объект по идентификатору, но я возвращаю 404 ошибки


person Community    schedule 18.06.2019    source источник
comment
Реализация вашего сервера — это то, что обрабатывает создание/удаление и другую бизнес-логику. Как реализован ваш сервер? Действительно ли он реализует GET и DELETE для конечной точки /api/globalorderdays/{Id}?   -  person Helen    schedule 19.06.2019
comment
Прямо сейчас я запускаю SwaggerHub API Auto Mocking.   -  person    schedule 19.06.2019
comment
@Helen Я также пытался использовать Postman и использовал его фиктивный сервер, и я все еще могу успешно публиковать сообщения, но все еще не могу ПОЛУЧИТЬ или УДАЛИТЬ. Я возвращаю 404 ошибки   -  person    schedule 19.06.2019


Ответы (1)


Есть несколько проблем с вашей спецификацией.

  1. Путь /api/globalorderdays/{Id} повторяется несколько раз. Это недействительно.

    # Incorrect
    
    /api/globalorderdays/{Id}:
      get:
        ...
    
    /api/globalorderdays/{Id}:
      delete:
        ...
    

    Вместо этого укажите путь один раз и перечислите все его HTTP-методы под ним, например:

    /api/globalorderdays/{Id}:
      get:
        ...
      delete:
        ...
    
  2. В примерах параметров отсутствует значение:

    schema:
      type: integer
      example:   # <-----
    

    Отсутствующее значение в YAML эквивалентно null, но null не является допустимым примером для целочисленной схемы. Либо добавьте правильный целочисленный пример, например example: 1, либо удалите ключевое слово example из этих схем.

Как только эти проблемы будут исправлены, макеты для GET и DELETE будут работать правильно.

person Helen    schedule 19.06.2019
comment
Спасибо за ответ! Я пошел дальше и исправил ошибки, которые вы поймали. Я все еще сталкиваюсь с той же проблемой. Я получаю успешный 201, когда публикую, но когда я иду, чтобы получить или удалить его, я все еще получаю 404 на почтальоне и 405 на редакторе чванства. Как вы думаете, это как-то связано с моим компонентом GlobalOrderSetupInfo и компонентом SessionInfoList, имеющим Id в качестве свойства? - person ; 19.06.2019
comment
Как выглядят фактические запрос и ответ, когда вы получаете ошибки 404/405? - person Helen; 19.06.2019
comment
Я не уверен, что вы имеете в виду под своим вопросом. 405 просто говорит, что недокументировано, а в сообщении об ошибке 404 говорится, что нам не удалось найти в вашей коллекции ни одного совпадающего запроса для этого типа метода и фиктивного пути «/api/globalorderdays/1». - person ; 19.06.2019
comment
Удалите интеграцию API Auto Mocking, а затем снова добавьте ее, чтобы принудительно обновить макет. Если это не решит проблему, обратитесь в службу поддержки SwaggerHub, чтобы решить проблему с ними. . - person Helen; 19.06.2019
comment
что наполовину исправил это. Так что теперь я могу успешно POST и DELETE. Но когда вы пытаетесь использовать метод GET, он возвращает 200 только с телом примера, а не с тем, что я на самом деле пытался опубликовать. - person ; 19.06.2019
comment
Это ожидаемо — это как работает макет. Макет возвращает статические ответы на основе примеров, представленных в схеме. Чтобы иметь какую-либо бизнес-логику, вам необходимо реализовать сервер, например. создайте заглушку сервера, напишите код, который фактически реализует каждую операцию, запустите сервер, а затем укажите документы API на ваш рабочий сервер. - person Helen; 19.06.2019