Dart - строка Base64 не равна Python - PullRequest
0 голосов
/ 04 мая 2018

Когда я использую Python для генерации строки base64, которая будет использоваться в raw key { 'raw': value } GMAIL API, отправка электронной почты происходит идеально.

Но когда я использую Dart для генерации той же строки base64, строка не совпадает с python, и поэтому я не могу отправить электронное письмо, потому что API GMAIL сообщает мне message: Invalid value for ByteString

Строка, которая будет преобразована в base64:

var message = '''<html><meta http-equiv="content-type" content="text/html; charset=utf-8"/><head></head><body>Test</body></html>'''

Код Python:

import base64

e = base64.urlsafe_b64encode('''<html><meta http-equiv="content-type" content="text/html; charset=utf-8"/><head></head><body>Test</body></html>''')
print(e)

результат:

PGh0bWw-PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz48aGVhZD48L2hlYWQ-PGJvZHk-VGVzdDwvYm9keT48L2h0bWw-

Код дротика:

import 'dart:convert';
var _bytes = utf8.encode('''<html><meta http-equiv="content-type" content="text/html; charset=utf-8"/><head></head><body>Test</body></html>''');
var _base64 = base64Encode(_bytes);
print(_base64);

результат:

PGh0bWw+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz48aGVhZD48L2hlYWQ+PGJvZHk+VGVzdDwvYm9keT48L2h0bWw+

Обратите внимание, что единственным отличием является знак + в строке base64 Дротика и знак - в строке base64 Python

Как я могу сгенерировать тот же код Python Base64, чтобы я мог отправить электронное письмо в API GMAIL

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Dart имеет безопасную для URL версию кодирования Base 64, например Python.

Изменение

var _base64 = base64Encode(_bytes);

до

var _base64 = base64UrlEncode(_bytes);

0 голосов
/ 04 мая 2018

Вы явно попросили Python заменить все символы + на - в строке, закодированной в base64, поскольку вы использовали вариант urlsafe_b64encode! В документации написано:

base64.urlsafe_b64encode (s)

Кодирование байтовоподобных объектов с использованием алфавита, безопасного для URL и файловой системы, который заменяет вместо + и _ вместо / в стандартном алфавите Base64 и возвращает закодированные байты. Результат все еще может содержать =.

Если вы хотите получить ту же строку, что и Dart, просто используйте encodebytes для Python3 или encode для Python 2.

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