当前位置: 首页 > 知识库问答 >
问题:

grpc REST网关中的ETags和304未修改响应

曾丰茂
2023-03-14

我正在使用Github的grpc网关项目从gRPC规范自动生成REST API。在这个REST API中,我想支持ETag标头和304 Not Modify响应。

据我所知,通常情况下,您会在gRPC服务器中创建一个带有特定状态代码的响应,然后该状态代码将由gRPC网关转换为HTTP状态代码。然而,由于标准gRPC并不真正支持缓存概念,因此没有映射到HTTP 304状态代码的gRPC状态代码。

使用grpc网关,似乎可以在grpc状态代码为en错误代码时自定义HTTP状态代码(覆盖runtime.HTTPError函数)。然而,当gRPC repsonse代码正常时,我还没有找到任何定制HTTP响应代码的方法。

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

共有1个答案

韦修文
2023-03-14

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

您可以参考这些说明进行设置,然后按照以下步骤实现该方法:

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服务器发出请求,但会阻止在ETag匹配时将这些字节发送回客户端

 类似资料:
  • 我有以下来自数据库的路由配置 所有代理服务都将返回公共响应json以防出现错误场景

  • 我有一个自定义TCP服务器正在侦听端口5888(虚拟端口)。代理服务器侦听传入的连接。当代理接收到某些页面的HTTP请求时,它应该将其中继到端口80上的主服务器。对于其他页面请求,代理需要将数据发送到端口8081上的主服务器。 客户端从代理请求一个.js文件。代理将相同的请求发送到端口80上的主服务器。主服务器正在将此消息与Connection:Close一起发回。 这会导致服务器和客户端套接字断

  • 问题内容: 如何检查jQuery.ajax()请求标头状态是否为“ 304未修改”? 通常返回,即使请求的标头是“ 304 Not Modified”。 并没有太大帮助,因为它中断了XHR数据请求。 问题答案: 如果不手动处理高速缓存头,则不可能。通常,XHR API无法提供304个响应: 对于由于用户代理生成的条件请求 而 产生的304未修改响应, 用户代理必须像服务器给出200 OK响应并提供

  • 我正在尝试使用ETags和nginx (1.2.1)服务器理解本地缓存,该服务器将php的请求重定向到php-cgi守护进程。 这里是我的简单索引。电话: 在第二个请求之后,我的浏览器会发送一个 If-None-匹配 标头: 但是我的网络服务器没有返回304: 除非我误解了,否则我的服务器应该将 Etag 与发送的 If-None-Match 进行比较,并返回 304 响应,因为它们是相同的。 我

  • 选中数据后,数据框内显示出“数据样式”、“编辑信息”、“删除”、“图片上传”按钮; 数据样式 点击数据样式按钮,可以对单个网点的样式进行修改,详情操作参考“1.2.4 数据信息框-修改样式” 修改网点属性信息: 点击“编辑信息”按钮,这时网点的属性处于可编辑状态,可以对属性值进行任意修改,修改完成后进行保存 新增网点字段: 编辑状态下,也可添加新的字段。点击“新增字段”,弹出添加字段框,输入字段名

  • 条件 GET 是一个伟大的方式来减少带宽,并可能提高对服务器端性能,根据信息用于确定条件是如何计算出来的。一个设计良好的网站例如返回 304 (Not Modified) 响应给它提供的静态图像服务。 JAX-RS 使用上下文接口Request来提供对条件 GET 的支持。 下面的例子显示了对条件 GET 的支持: Example 7.7. Conditional GET support publ