如何在 swagger 后端实现新的媒体类型
How to implement new media types in swagger backend
我创建了一个生成“application/zip”
的 swagger 规范
/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 {
...
}
所以我的问题是
我们应该在这个 Producer 中放什么,为什么有必要实现这个,因为没有实现“application/json”?
是不是默认实现了“application/json”生产者,我们需要实现其他生产者?
注意:我使用的是 swagger“2.0”规范
既然您使用“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”,它的生产者是默认实现的
我创建了一个生成“application/zip”
的 swagger 规范/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 {
...
}
所以我的问题是
我们应该在这个 Producer 中放什么,为什么有必要实现这个,因为没有实现“application/json”?
是不是默认实现了“application/json”生产者,我们需要实现其他生产者?
注意:我使用的是 swagger“2.0”规范
既然您使用“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”,它的生产者是默认实现的