Можно ли возвращать пользовательские ошибки на сервере Python gRPC? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть .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;
}

У этой реализации есть один недостаток: сервисы должны проверять наличие ошибки, а затем обрабатывать ошибку, иначе обработать ответ.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Существует пример для возврата пользовательской ошибки на https://github.com/grpc/grpc/tree/master/examples/python/errors.

0 голосов
/ 22 мая 2019

Вы можете возвращать пользовательские пары KV в конечных метаданных.

Пример из модульного теста: https://github.com/grpc/grpc/blob/master/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py#L430

...