Ошибка ParseFromString для декодирования сообщения - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь взаимодействовать с RESTful API, который принимает объекты application / x-protobuf в post.

.proto пример объекта:

message register
{
    required string name = 1;
    required int32 id = 2;
}

с помощью запросов я могу отправить это сообщение на сервер и получить 200.

например

register = protobuf_pb2.register()
register.name = "foo"
register.id = 1

response = requests.request("POST", url, data=register.SerializeToString(), headers=headers)

когда я смотрю на эту полезную нагрузку в формате SerializeToString (), она показывает аналогично

b '\ n \ t \ n \ x03foo \ x10 \ x01'

В качестве проверки работоспособности я могу затем создать новый объект сообщения и .ParseFromString () для него обратно в правильный формат сообщения.

Второй URI на сервере позволяет отправить запрос GET для получения тех же данных.Поэтому я использовал следующее:

register = protobuf_pb2.register()
response = requests.request("GET", url, headers=headers).content
register.ParseFromString(response)

Ответ возвращает

b'foo: 1 \ n '

И ParseFromString возвращает исключение

DecodeError ('Ошибка разбора сообщения',)

Я пропустил где-нибудь шаг?Нужно ли каким-либо образом кодировать полезную нагрузку .content перед анализом?

Большое спасибо.

1 Ответ

0 голосов
/ 17 апреля 2019

Объект, который вы возвращаете с сервера, - это двоичные данные в кодировке UTF-8, поэтому Python интерпретирует его как объект bytes (в Python 3 bytes и str - это разные типы).

m = b'foo:1\n'
type(m)
Out[1]: bytes

m.decode('utf-8')
Out[2]: 'foo:1\n'

ParseFromString однако ожидает строку, поэтому она выдает DecodeError;просто используйте decode() с соответствующей кодировкой.

В заголовках ответов вы сможете найти используемую кодировку: почти все используют UTF-8, но в «реальном» коде Production вы должны проверитьэто тоже: в Content-Type (или вы даже можете запросить определенный с помощью Accept-Charset, но вы можете получить 406, если сервер не может выполнить его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...