gpt4 book ai didi

rest - grpc REST 网关中的 ETags 和 304 Not Modified 响应

转载 作者:IT王子 更新时间:2023-10-29 02:21:35 26 4
gpt4 key购买 nike

我正在使用 grpc-gateway 从 gRPC 规范自动生成 REST API来自 Github 的项目。在此 REST API 中,我想支持 ETag header 和 304 Not Modified 响应。

据我了解,通常您会在 gRPC 服务器中创建一个具有特定状态代码的响应,然后该状态代码将由 grpc-gateway 转换为 HTTP 状态代码。但是,由于标准 gRPC 并不真正支持缓存概念,因此没有映射到 HTTP 304 状态代码的 gRPC 状态代码。

使用 grpc-gateway,似乎可以在 gRPC 状态代码为错误代码时自定义 HTTP 状态代码(覆盖 runtime.HTTPError 函数)。但是,我还没有找到任何方法来在 gRPC 响应代码正常时自定义 HTTP 响应代码。

那么,有什么推荐的方法可以实现这一目标吗?

最佳答案

这是一个使用自定义转发器实现基本 etag 和 304 响应的示例。

可以引用这些directions进行设置,然后按照以下方式实现该方法:

func forwardGetPost(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, req *http.Request, resp proto.Message, opts ...func(context.Context, http.ResponseWriter, proto.Message) error) {
// add cache-control rules for this proxy endpoint
w.Header().Add("Cache-Control", "max-age=60")

// create an etag
// (when the response represents some entity from the db it may have a last edited timestamp)
p := resp.(*Post)
etag := fmt.Sprintf("W/%q", p.GetLastEdited())
w.Header().Add("ETag", etag)

// check whether the request provides an etag
inm := req.Header.Get("If-None-Match")
if inm != "" {
if inm == etag {
w.WriteHeader(http.StatusNotModified)
}
}
runtime.ForwardResponseMessage(ctx, mux, marshaler, w, req, resp, opts...)
}

这不会阻止代理向 grpc 服务器发出请求,但会阻止在 etags 匹配时将这些字节发送回客户端。

关于rest - grpc REST 网关中的 ETags 和 304 Not Modified 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com