登录
首页 >  Golang >  Go问答

限制响应大小的 go-swagger openAPI 控制

来源:stackoverflow

时间:2024-03-16 10:24:30 391浏览 收藏

在使用 go-swagger openAPI 生成 REST 客户端时,您可以通过实现自定义的 runtime.Consumer 和 runtime.ClientResponseReader 接口来限制响应大小。自定义的 runtime.Consumer 将使用您指定的读取限制(例如 LimitReader)来读取响应正文,而自定义的 runtime.ClientResponseReader 将使用自定义的 runtime.Consumer 来包装旧的实现。通过将自定义的 clientoption 函数作为参数传递给生成的客户端代码中的可变参数函数,您可以应用这些自定义实现来限制响应大小。

问题内容

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

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

是否也可以使用 go-swagger openAPI 来限制响应大小?


解决方案


您需要实现自定义 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,
    }
}

以上就是《限制响应大小的 go-swagger openAPI 控制》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>