首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用go-swagger openAPI限制响应大小

使用go-swagger openAPI限制响应大小
EN

Stack Overflow用户
提问于 2021-02-11 15:40:43
回答 1查看 384关注 0票数 3

我使用go-swagger openAPI来生成REST客户端。

现在,我想将响应大小限制在最大值,例如1MB。在Go中,这意味着在使用响应的正文时使用LimitReader。

有没有办法也用go-swagger openAPI来限制响应大小?

EN

回答 1

Stack Overflow用户

发布于 2021-02-12 00:00:49

您将希望实现自定义runtime.Consumer,然后在实现客户端时使用它。

您生成的客户端代码将导出variadic functions,允许传入任意数量的客户端选项。这些客户端选项将是Go类型(ClientOption),它是一个接受*runtime.ClientOperation的函数。

创建ClientOption函数,该函数将其参数的Reader字段分配给自定义的runtime.ClientResponseReader接口实现。这个自定义实现应该包装旧的,但是使用你想要的消费者。

自定义runtime.Consumer

代码语言:javascript
复制
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包装。

代码语言:javascript
复制
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函数

代码语言:javascript
复制
var myClientOption api.ClientOption
myClientOption = func(operation *runtime.ClientOperation) {
    oldReader := operation.Reader
    operation.Reader = myClientResponseReader{
        consumer: customLimitConsumer{
            limit: 1000000,
        },
        oldClientResponseReader: oldReader,
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66150567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档