2

我创建了一个产生“应用程序/压缩包”的招摇规范

/config:
  get:
    produces:
      - application/zip
    responses:
        200: # OK
          description: All config files
          schema:
            type: string
            format: binary

我已经为这个端点实现了处理程序,但我收到了这个错误

http: panic serving 127.0.0.1:20366: applicationZip producer has not yet been implemented

此错误来自此代码

func NewSampleAPI(spec *loads.Document) *SampleAPI {
    return &SampleAPI{
    ...
        ApplicationZipProducer: runtime.ProducerFunc(func(w io.Writer, data interface{}) error {
            return errors.NotImplemented("applicationZip producer has not yet been implemented")
        }),

在调查了这个错误之后,我的发现是我们需要实现这样的东西

api := operations.NewSampleAPI(swaggerSpec)
api.ApplicationZipProducer = func(w io.Writer, data interface{}) error {
    ...
}

所以我的问题是

  1. 我们应该在这个 Producer 中放入什么,为什么有必要实现它,因为“application/json”没有实现?

  2. “application/json”Producer是默认实现的,我们需要实现其他Producer吗?

注意:我使用的是 swagger "2.0" 规范

4

1 回答 1

1

由于您使用“application/zip”作为响应内容,那么您可能已经实现了可能返回 io.ReadCloser 的后端代码。然后你的 Producer 看起来像这样

api.ApplicationZipProducer = runtime.ProducerFunc(func(w io.Writer, data interface{}) error {
        if w == nil {
            return errors.New("ApplicationZipProducer requires a writer") // early exit
        }

        if data == nil {
            return errors.New("no data given to produce zip from")
        }
        if zp, ok := data.(io.ReadCloser); ok {
            b, err := ioutil.ReadAll(zp)
            if err != nil {
                return fmt.Errorf("application zip producer: %v", err)
            }
            _, err = w.Write(b)
            return nil
        }
        return fmt.Errorf("%v (%T) is not supported by the ApplicationZipProducer, %s", data, data)
    })

这会将数据接口解析为 io.ReadCloser 并从中读取数据,然后将其填充到 io.Writer

注意:如果您的主要目的只是将文件作为附件发送,那么您应该使用“application/octet-stream”,它的生产者是默认实现的

于 2021-02-03T13:46:00.573 回答