条件请求#
条件请求#
有内置工具用于处理conditional requests,它们有两个主要用途:
- 在读取未更改的文档时节省带宽,即“仅在版本与我已有的不同时发送”。
- 防止多个写入者覆盖彼此的更改,即“仅在服务器上的版本与我上次看到的匹配时保存”。
添加对条件请求处理的 支持需要四个步骤:
- 导入
github.com/danielgtaylor/huma/v2/conditional包。 - (可选)添加响应定义(读取时为
304 Not Modified,写入时为412 Precondition Failed) - 将
conditional.Params添加到您的输入结构体中。 - 检查是否传递了条件参数并处理它们。
HasConditionalParams()和PreconditionFailed(...)方法可以帮助实现这一点。
示例#
实现条件读取可能如下所示:
huma.Register(api, huma.Operation{
OperationID: "get-resource",
Method: http.MethodGet,
Path: "/resource",
Summary: "获取资源",
}, func(ctx context.Context, input struct {
conditional.Params
}) (*YourOutput, error) {
if input.HasConditionalParams() {
// TODO: 从资源获取 ETag 和最后修改时间。
etag := ""
modified := time.Time{}
// 如果前提条件失败,则中止请求处理。响应状态
// 代码已为您设置,但您可以选择提供响应体。
// 返回 HTTP 304 未修改。
if err := input.PreconditionFailed(etag, modified); err != nil {
return err
}
// 否则在此处执行正常的请求处理...
// ...
}
})
条件请求效率
注意,构建自定义数据库查询来处理条件请求更高效,但是 Huma 不知道您的数据库。内置的条件工具设计为通用工具,可与任何数据源配合使用,是快速入门条件请求处理的便捷方式。
深入了解#
- 参考
- 外部链接