Swagger嵌套的对象数组

时间:2016-09-10 13:37:21

标签: arrays object nested swagger

我被要求用swagger来描述API,我很难让更复杂的情况发挥作用。想象一下,您正在发布包含多个订单商品的订单

<upload_order>
<token>d6a91238b0f17b49d49fbdcbba773d71</token>
<order>
    <order_id>10006</order_id>
    <item_value>48.50</item_value>
    <postage_value>5.00</postage_value>
    <gross_value>A43.50</gross_value>
    <discount_value>10.00</discount_value>
    <delivery_date>2016-10-32</delivery_date>
    <customer_name>Tom H</customer_name>
    <business_name>Toysorry</business_name>
    <address_line_1>Adderss Line 1</address_line_1>
    <address_line_2>Adderss Line 1</address_line_2>
    <town>Town</town>
    <county>County</county>
    <postcode>PO123ST</postcode>
    <email>email@email.com</email>
    <telephone>0787878787878</telephone>
    <delivery_instructions>Garage</delivery_instructions>
    <delivery_method>PRE12</delivery_method>
    <items>
        <item>
            <id>1</id>
            <sku>BLABLA</sku>
            <qty>A</qty>
            <product_name>A Product</product_name>
            <unit_price>1.50</unit_price>
        </item>
        <item>
            <id>2</id>
            <sku>HAHAHA</sku>
            <qty>2</qty>
            <product_name>WINTER BUNDLE</product_name>
            <unit_price>22.00</unit_price>
        </item>
    </items>
</order>

我怎么能在招摇中描述它,因为以这种方式使用数组似乎没有发挥

/upload_order:
post:
  description: create order
  operationId: upload_order
  produces:
    - application/xml
  parameters:
    - name: upload_order
      in: body
      description: upload order
      required: true
      schema:
        $ref: '#/definitions/newOrder'
  responses:
    '200':
      description: response
      schema:
        $ref: '#/definitions/token_response'
    default:
      description: unexpected error
      schema:
        $ref: '#/definitions/errorModel'



newOrder:
    type: object
    required:
      - token
      - order_id
      - item_value
      - postage_value
      - gross_value
      - discount_value
      - delivery_date
      - customer_name
      - business_name
      - address_line_1
      - address_line_2
      - town
      - county
      - postcode
      - email
      - telephone
      - delivery_instructions
      - delivery_method
      - items
    properties:
      token:
        type: string
      order_id:
        type: string
      item_value:
        type: number
        format: float
      postage_value:
        type: number
        format: float
      gross_value:
        type: number
        format: float
      discount_value:
        type: number
        format: float
      delivery_date:
        type: string
        format: date
      customer_name:
        type: string
      business_name:
        type: string
      address_line_1:
        type: string
      address_line_2:
        type: string
      town:
        type: string
      county:
        type: string
      postcode:
        type: string
      email:
        type: string
      telephone:
        type: string
      delivery_instructions:
        type: string
      delivery_method:
        type: string
      items:
        $ref: '#/definitions/itemsArray'
  itemsArray:
    type: array
    required: item
    item:
      $ref: '#/definitions/item'
  item:
    required:
      - id
      - sku
      - qty
      - product_name
      - unit_price
    type: object
    properties:
      id:
        type: string
      sku:
        type: string
      qty:
        type: integer
        format: int32
      product_name:
        type: string
      unit_price:
        type: number
        format: float

请救救我

由于

更新 - 我根据完整的PET商店标记拍摄了很短的一天,忘记发布答案,为某些事情提供了便利点

paths:
  /upload_order:
    post:
      description: create order
      operationId: upload_order
      parameters:
        - name: upload_order
          in: body
          description: upload order
          required: true
          schema:
            $ref: '#/definitions/uploadOrder'
      responses:
        '200':
          description: response
          schema:
            $ref: '#/definitions/upload_response'
        default:
          description: unexpected error
          schema:
            $ref: '#/definitions/errorModel'
definitions:
  uploadOrder:
    type: object
    required:
      - upload_order
    properties:
      upload_order:
        $ref: '#/definitions/uploadOrderData'
  uploadOrderData:
    type: object
    required:
      - login
      - order
    properties:
      login:
        $ref: '#/definitions/login'
      order:
        $ref: '#/definitions/order'
  order:
    type: object
    required:
      - order_id
      - address_line_2
      - items
    properties:
      order_id:
        type: string
      item_value:
        type: string
        pattern: '^(\d{1,100}\.\d{2})$'
        default: '0.00'
      postage_value:
        type: string
        pattern: '^(\d{1,100}\.\d{2})$'
        default: '0.00'
      gross_value:
        type: string
        pattern: '^(\d{1,100}\.\d{2})$'
        default: '0.00'
      discount_value:
        type: string
        pattern: '^(\d{1,100}\.\d{2})$'
        default: '0.00'
      delivery_date:
        type: string
        format: date
      customer_name:
        type: string
      business_name:
        type: string
      address_line_1:
        type: string
      address_line_2:
        type: string
      town:
        type: string
      county:
        type: string
      postcode:
        type: string
      email:
        type: string
      telephone:
        type: string
      delivery_instructions:
        type: string
      delivery_method:
        type: string
      items:
        $ref: '#/definitions/orderItems'
  orderItems:
    type: array
    required:
      - item
    properties:
      item:
        $ref: '#/definitions/orderItem'
    items:
      $ref: '#/definitions/orderItem'
  orderItem:
    required:
      - id
      - sku
      - qty
      - product_name
      - unit_price
    type: object
    properties:
      id:
        type: string
      sku:
        type: string
      qty:
        type: integer
        format: int32
      product_name:
        type: string
      unit_price:
        type: string
        pattern: '^(\d{1,100}\.\d{2})$'
        default: '0.00'
  login:
    type: object
    required:
      - login
    properties:
      login:
        $ref: '#/definitions/login_data'
  login_data:
    type: object
    required:
      - username
      - password
      - channel_code
    properties:
      username:
        type: string
      password:
        type: string
      channel_code:
        type: string
  upload_response:
    type: object
    properties:
      response:
        $ref: '#/definitions/upload_response_data'
  upload_response_data:
    type: object
    required:
      - messages
      - success
    properties:
      messages:
        $ref: '#/definitions/messages'
      success:
        type: string
  errorModel:
    type: object
    required:
      - messages
    properties:
      messages:
        $ref: '#/definitions/messages'
  messages:
    type: array
    required:
      - message
    properties:
      message:
        $ref: '#/definitions/message'
    items:
      $ref: '#/definitions/message'
  message:
    type: string

1 个答案:

答案 0 :(得分:4)

根据您的XML文档,您似乎不需要类型itemsArray。您可以尝试直接引用newOrder中的item类型来简化items的定义。以下是修改后的类型定义的相关部分。

definitions:
  newOrder:
      type: object
      ...
      properties:
        ...
        delivery_method:
          type: string
        items:
          type: array
          items:
            $ref: '#/definitions/item'

  item:
      ...
      type: object
      properties:
        id:
          type: string
        ...

结果数据结构如下所示:http://i.stack.imgur.com/MyjpD.png

另外需要注意:由于token位于XML文档中order元素之外,您可能需要将newOrder类型拆分为两个并将token移至外部元素。为了给你一个想法,这里有一个例子,除了令牌移动到嵌套元素order之外的所有属性。

  newOrder:
    properties:
      token:
        type: string
      order:
        type: array
        items:
          $ref: '#/definitions/order'
  order:
    properties:
      order_id:
        type: string
      ...

结果类型定义:http://i.stack.imgur.com/P12Ah.png