我使用go-swagger openAPI来生成REST客户端。
现在,我想将响应大小限制在最大值,例如1MB。在Go中,这意味着在使用响应的正文时使用LimitReader。
有没有办法也用go-swagger openAPI来限制响应大小?
发布于 2021-02-12 00:00:49
您将希望实现自定义runtime.Consumer,然后在实现客户端时使用它。
您生成的客户端代码将导出variadic functions,允许传入任意数量的客户端选项。这些客户端选项将是Go类型(ClientOption),它是一个接受*runtime.ClientOperation的函数。
创建ClientOption函数,该函数将其参数的Reader字段分配给自定义的runtime.ClientResponseReader接口实现。这个自定义实现应该包装旧的,但是使用你想要的消费者。
自定义runtime.Consumer
type customLimitConsumer struct {
limit int64
}
func (c customLimitConsumer) Consume(reader io.Reader, i interface{}) error {
// Read all the data, up to the limit.
data, err := ioutil.ReadAll(io.LimitReader(reader, c.limit))
if err != nil {
return err
}
// TODO Unmarshal data into i.
return nil
}自定义runtime.ClientResponseReader包装。
type myClientResponseReader struct {
consumer runtime.Consumer
oldClientResponseReader runtime.ClientResponseReader
}
func (m myClientResponseReader) ReadResponse(response runtime.ClientResponse, _ runtime.Consumer) (interface{}, error) {
return m.oldClientResponseReader.ReadResponse(response, m.consumer)
}要作为参数传递给生成的可变函数的自定义ClientOption函数
var myClientOption api.ClientOption
myClientOption = func(operation *runtime.ClientOperation) {
oldReader := operation.Reader
operation.Reader = myClientResponseReader{
consumer: customLimitConsumer{
limit: 1000000,
},
oldClientResponseReader: oldReader,
}
}https://stackoverflow.com/questions/66150567
复制相似问题