Десериализация Python Grpc ByteString

После запроса к серверу GRPC-java в клиенте Python я получаю объект следующего вида:

<class 'GetInsertService_pb2.CountResponse'>

Он имеет следующие методы:

['ByteSize', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DESCRIPTOR', 'DiscardUnknownFields', 'Extensions', 'FindInitializationErrors', 'FromString', 'HasExtension', 'HasField', 'IsInitialized', 'ListFields', 'MergeFrom', 'MergeFromString', 'ParseFromString', 'RegisterExtension', 'SerializePartialToString', 'SerializeToString', 'SetInParent', 'UnknownFields', 'WhichOneof', '_CheckCalledFromGeneratedFile', '_SetListener', '__class__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '_extensions_by_name', '_extensions_by_number', 'result']

Прото выглядит так:

message UIDRequest {
    string uid = 1;
}

//
message CountResponse {
    string result = 1;
}

service GetInsertService {
    rpc get(UIDRequest) returns (CountResponse);

}

Моя реализация Java-сервера:

public class GetInsertServiceImpl
    extends GetInsertServiceGrpc.GetInsertServiceImplBase {

  @Override
  public void get(
      GetInsertServiceOuterClass.UIDRequest request,
      StreamObserver<GetInsertServiceOuterClass.CountResponse> responseObserver) {

    RawKVClient dbClient = SingletonDB.getInstance().client;

    ByteString res =
        dbClient.get(ByteString.copyFrom(String.valueOf(request.getUid()), Charsets.UTF_8));
    GetInsertServiceOuterClass.CountResponse response =
        GetInsertServiceOuterClass.CountResponse.newBuilder()
            .setResult(res.toString())
            .build();
    // Use responseObserver to send a single response back
    responseObserver.onNext(response);

    // When you are done, you must call onCompleted.
    responseObserver.onCompleted();
  }

Это мой клиентский py-код:

    channel_grpc = grpc.insecure_channel('ip:port')
    stub = GetInsertService_pb2_grpc.GetInsertServiceStub(channel_grpc)
    msg_count = stub.get(GetInsertService_pb2.UIDRequest(uid=user_id))

Таким образом, msg_count содержит строку значений result внутри.

Но когда я это делаю:
- msg_count.SerializeToString() я получаю b'\n\x1c<ByteString@3ffef3bb size=2>'
- msg_count.result возвращает result: "<ByteString@3ffef3bb size=2>"

Как получить фактическое значение (например, «14» вместо <ByteString@3ffef3bb size=2>)?


person techkuz    schedule 14.01.2020    source источник
comment
Не могли бы вы опубликовать свою реализацию сервера, я думаю, она возвращает строку <ByteString@3ffef3bb size=2>   -  person Phung Duy Phong    schedule 14.01.2020
comment
Просто попросите вас распечатать res.toString() :D   -  person Phung Duy Phong    schedule 14.01.2020


Ответы (1)


Ваш сервер может возвращать строку <ByteString@3ffef3bb size=2>, а не код вашего клиента.

Также из вашего комментария на java-сервере используйте res.toStringUtf8() для применения кодировки utf8.

person Phung Duy Phong    schedule 14.01.2020