go-swagger响应有效载荷而不是模型类型

时间:2016-07-20 10:28:55

标签: go-swagger

我正在大摇大摆的主人https://github.com/go-swagger/go-swagger/commit/3981236c3f6bd9eabb26f14e9d31b853d340405f

不确定这是一个问题,还是我不了解。我有一个healthcheck方法,默认情况下返回状态500以及模型中定义的errorMessage对象。但是,WithPayload方法采用GetHealthcheckDefaultBodyBody类型。这里不是一个大问题,因为我可以创建其中一个,但是我需要返回模型类型的数组,我最终会编写大量的样板来映射从模型类型到BodyBody类型,EG

func ClientsGet(params clients.GetClientsParams) middleware.Responder {

    results, err := repository.GetAllClients()

    if err != nil {
        return clients.NewGetClientsDefault(500).WithPayload(clients.GetClientsDefaultBodyBody{Message: sPtr(err.Error())})
    }


    return &clients.GetClientsOK{results} //does not compile as GetClientsOK accepts []*clients.GetClientsOKBodyBody not []*models.Client
}

我注意到repo中的示例代码在这方面与我生成的代码不同:https://github.com/go-swagger/go-swagger/blob/3981236c3f6bd9eabb26f14e9d31b853d340405f/examples/tutorials/todo-list/server-complete/restapi/operations/todos/add_one_responses.go。我无法在此处生成示例规范中的代码:https://github.com/go-swagger/go-swagger/blob/3981236c3f6bd9eabb26f14e9d31b853d340405f/examples/tutorials/todo-list/server-complete/swagger.yml

我的规格:

{
  "swagger": "2.0",
  "info": {
    "title": "M3 Intl Maas Service",
    "version": "0.1.0"
  },
  "produces": [
    "application/json"
  ],
  "consumes": [
    "application/json"
  ],
  "schemes": [
    "http"
  ],
  "definitions": {
    "client": {
      "properties": {
        "id": {
          "format": "int64",
          "type": "integer"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name"
      ],
      "type": "object"
    },
    "messageTeaser": {
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "clientName": {
          "type": "string"
        },
        "footer": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "isNew": {
          "type": "boolean"
        },
        "jobNumber": {
          "type": "string"
        },
        "piLink": {
          "type": "string"
        },
        "repId": {
          "type": "string"
        },
        "summary": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "title",
        "summary",
        "isNew",
        "footer",
        "jobNumber",
        "clientName",
        "piLink",
        "repId",
        "campaignId"
      ],
      "type": "object"
    },
    "errorMessage": {
      "type": "object",
      "required": [
        "message"
      ],
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  },
  "paths": {
    "/clients": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "get client",
            "schema": {
              "items": {
                "properties": {
                  "id": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name"
                ],
                "type": "object"
              }
            }
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "clients"
        ]
      },
      "put": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          },
          {
            "in": "body",
            "required": true,
            "name": "client",
            "schema": {
              "properties": {
                "id": {
                  "format": "int64",
                  "type": "integer"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "type": "object"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "update client",
            "schema": {
              "items": {
                "properties": {
                  "id": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name"
                ],
                "type": "object"
              }
            }
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "clients"
        ]
      },
      "delete": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "delete client"
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/clients/{client_id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "get client",
            "schema": {
              "items": {
                "properties": {
                  "id": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name"
                ],
                "type": "object"
              }
            }
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "items": {
                "type": "object",
                "required": [
                  "message"
                ],
                "properties": {
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "clients"
        ]
      },
      "put": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          },
          {
            "in": "body",
            "required": true,
            "name": "client",
            "schema": {
              "properties": {
                "id": {
                  "format": "int64",
                  "type": "integer"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "type": "object"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "update client",
            "schema": {
              "items": {
                "properties": {
                  "id": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name"
                ],
                "type": "object"
              }
            }
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "items": {
                "type": "object",
                "required": [
                  "message"
                ],
                "properties": {
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "tags": [
          "clients"
        ]
      },
      "delete": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "client_id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "delete client"
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "items": {
                "type": "object",
                "required": [
                  "message"
                ],
                "properties": {
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/healthcheck": {
      "get": {
        "responses": {
          "200": {
            "description": "confirm that the service is healthy"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "type": "object",
              "required": [
                "message"
              ],
              "properties": {
                "message": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "healthcheck"
        ]
      }
    },
    "/usermessagesummary/{community_id}/{user_id}/{lang_id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "community_id",
            "type": "string"
          },
          {
            "in": "path",
            "required": true,
            "name": "user_id",
            "type": "string"
          },
          {
            "in": "path",
            "required": true,
            "name": "lang_id",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns message summary according to criteria",
            "schema": {
              "items": {
                "properties": {
                  "campaignId": {
                    "type": "string"
                  },
                  "clientName": {
                    "type": "string"
                  },
                  "footer": {
                    "type": "string"
                  },
                  "id": {
                    "type": "string"
                  },
                  "isNew": {
                    "type": "boolean"
                  },
                  "jobNumber": {
                    "type": "string"
                  },
                  "piLink": {
                    "type": "string"
                  },
                  "repId": {
                    "type": "string"
                  },
                  "summary": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "title",
                  "summary",
                  "isNew",
                  "footer",
                  "jobNumber",
                  "clientName",
                  "piLink",
                  "repId",
                  "campaignId"
                ],
                "type": "object"
              }
            }
          },
          "401": {
            "description": "unauthorised"
          },
          "404": {
            "description": "client not found"
          },
          "default": {
            "description": "generic error response",
            "schema": {
              "items": {
                "type": "object",
                "required": [
                  "message"
                ],
                "properties": {
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试:

"200": { "description": "get client", "schema": { "items": { "$ref": "#/definitions/client" } }

由于匿名定义,ref确保重用相同类型而不是生成新类型。