2017-10-06 9 views
1

Githubのgrpc-gatewayプロジェクトを使用してgRPC仕様からREST APIを自動生成しています。このREST APIでは、ETagのヘッダーと304のNot Modifiedレスポンスをサポートしたいと考えています。GRAPC RESTゲートウェイでETagと304未修正応答

私が理解する限り、通常、特定のステータスコードでgRPCサーバーに応答を作成し、そのステータスコードはgrpc-gatewayによってHTTPステータスコードに変換されます。しかし、標準のgRPCは実際にキャッシュ概念をサポートしていないので、HTTP 304ステータスコードに対応するgRPCステータスコードはありません。

grpc-gatewayを使用すると、gRPCステータスコードがenエラーコード(runtime.HTTPError関数を上書き)するたびに、HTTPステータスコードをカスタマイズすることができるようです。しかし、gRPCのrepsonseコードがOKの場合、HTTP応答コードをカスタマイズする方法はありませんでした。

これを達成するための推奨方法はありますか?

+0

これにも興味があります。ここに私はgithubリポジトリを見て見つけたいくつかの関連する問題があります:https://github.com/grpc-ecosystem/grpc-gateway/issues/240&https://github.com/grpc-ecosystem/grpc-gateway/issues/517 – thurt

+0

関連するGoogleグループのディスカッション:https://groups.google.com/forum/#!topic/grpc-io/1TJspS7QRwUお見積もり 「この[キャッシング]は、私たちが紹介したいことではないgrpcの中核である。それはあなたがあなたのメッセージに実装するものであるという意味で、実際に読者に運動として残されています。 rpcの種類によっては、その機能が適切であるとは限りません。そのため、すべての人がクリティカルパスで費用を支払わないようにしましょう。一方、認証はチャネル自体にあり、コードの存在は認証されていないチャネルには影響しません。 ' – thurt

答えて

0

ここでは、カスタムフォワーダを使用して基本的なエタグと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が一致したときにそれらのバイトがクライアントに返されます。

+1

こんにちは、返信いただきありがとうございます! If-None-Matchヘッダーを使用してGETリクエストを処理することをお勧めします。しかし、必ずしもそうでないかもしれないETag(あなたの例では、 "LastEdited")として機能することができるエンティティには、いくつかのプロパティが必要であるように見えます。関連する問題は、If-Matchヘッダーが何らかの形でgRPCを通じて転送される必要がある "If-Match"ヘッダーでPOST/PUT要求を処理する方法です。 –

+0

はい、私はそれらの事例も把握しようとしています。 Etagsに関して、一部の人々は全体の応答のmd5/sha1ハッシュを使用するでしょう。したがって、転送者は応答のタイプを知る必要はなく、Etagを作成するための応答フィールドに依存する必要もありません。トレードオフは、ハッシュを作成するためにCPUを集中的に使用することです。 – thurt

関連する問題