我想知道當我們發回給用戶時處理 grpc 狀態代碼和回應的最佳方法是什么?
func (us *customerService) FetchResponse(ctx context.Context, request *custPbV1.CustomerRequest) (*custPbV1.CustomerResponse, error) {
meta := service.MetadataFromContext(ctx)
clientId := meta.ClientId
if clientId <= 0 {
msg := fmt.Sprintf("could not retrieve client info for clientId:%d", clientId)
// is this right way to return it?
return nil, status.Error(codes.NotFound, msg)
}
resources := request.GetResources()
if len(resources) == 0 {
// is this right way to return it?
err := status.Error(codes.InvalidArgument, "value cannot be null. (Parameter 'resources')")
return nil, err
}
return us.GenerateCustomerInfo(clientId, resources)
}
我的原型很簡單——
service CustomerService {
rpc FetchResponse(CustomerRequest) returns (CustomerResponse) {};
}
message CustomerRequest {
string resources = 1;
}
message CustomerResponse {
string proc = 1;
string data = 2;
}
GenerateCustomerInfo方法將回傳CustomerResponse和error兩者。但是如果出現錯誤,那會是什么狀態碼呢?我試圖弄清楚人們在將 grpc 狀態代碼和回應回傳給用戶時基本上遵循的標準是什么。是否必須將狀態代碼回傳給客戶端?
在回應物件中也有錯誤屬性是個好主意嗎?任何演示如何回傳 grpc 狀態和回應的最佳實踐的示例對我都有用。
uj5u.com熱心網友回復:
這樣做完全沒問題:
err := status.Error(codes.InvalidArgument, "value cannot be null. (Parameter 'resources')")
return nil, err
這將告訴您的客戶存在錯誤,并且客戶可以根據這些資訊檢查狀態代碼和狀態訊息,如下所示:
resp, err = server.FetchResponse(context.Background(), req)
s, ok := status.FromError(err)
if ok { // there is an error
fmt.Printf("Code: %d, Message: %s\n", s.Code(), s.Message())
}
GenerateCustomerInfo 方法將同時回傳 CustomerResponse 和錯誤。但是如果出現錯誤,那會是什么狀態碼呢?
對于GenerateCustomerInfo我們沒有太多要復制的資訊,但在我看來,您應該只回傳如下內容:
return &custPbV1.CustomerResponse{
Proc: "YOUR_PROC",
Data: "YOUR_DATA",
}, nil
通過回傳nil錯誤,您將向客戶端顯示沒有錯誤,并且在前面的代碼中給出的ok將為 false。
在回應物件中也有錯誤屬性是個好主意嗎?
為此,您絕對可以添加一個錯誤屬性,但有必要這樣做嗎?你已經可以有一個 StatusCode 和一個 Message。它只會不必要地增加有效載荷的大小。
但是如果 GenerateCustomerInfo 回傳任何錯誤,那么我應該回傳什么狀態代碼?我也需要定義嗎?
鑒于 1GenerateCustomerInfo` 的潛在實作,例如:
func GenerateCustomerInfo() (*pb.CustomerResponse, error) {
// some code
if err {
st := status.Error(codes.Internal /*or other*/, "a message")
return nil, err
}
return &pb.CustomerResponse{
Proc: "",
Data: "",
}, nil
}
它基本上會回傳 aCustomerResponse或nilwhich 完全是父函式所需要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438863.html
下一篇:每次寫檔案時如何在末尾加上逗號?
