У меня есть .proto
файл:
// Protocol Buffers Language version
syntax = "proto3";
package my_package;
// -----------------Cart service-----------------
service CartService {
rpc AddItem(AddItemRequest) returns (AddItemResponse) {}
}
message CartItem {
string product_id = 1;
int32 quantity = 2;
}
message AddItemRequest {
string user_id = 1;
CartItem item = 2;
}
message AddItemResponse {
string user_id = 1;
}
В моем методе AddItem
я хочу вернуть пользовательскую ошибку, такую как cart_not_found
:
class CartService(my_package_pb2_grpc.CartServiceServicer):
def AddItem(self, request, context):
context.set_code(StatusCode.CART_NOT_FOUND)
context.set_details('Cart Not Found!')
return context
Приведенный выше код не работает, так как коды состояния gRPC
ограничены некоторым базовым списком. Как я могу вернуть пользовательские ошибки в gRPC
?
EDIT-1:
Я видел примеры, которые подробно описывают машиночитаемый код, как показано ниже:
context.set_code(grpc.StatusCode.INTERNAL)
context.set_details('cart_not_found')
return context
Но это имеет свои ограничения, и я не могу задать описание ошибки или любого другого пользовательского ключа.
Другой метод - возвращать ошибку в каждом сообщении, которое вы видите ниже:
message AddItemResponse {
string user_id = 1;
Error error = 2;
}
message Error {
string code = 1;
string message = 2;
}
У этой реализации есть один недостаток: сервисы должны проверять наличие ошибки, а затем обрабатывать ошибку, иначе обработать ответ.