Как мне url-кодировать в Dart в формате, который ожидает API Twitter?

Я написал некоторый код для публикации твитов в C#. Одна из вещей, которая меня смутила, была url-кодировка данных, так как казалось, что есть много вариантов:

var input = "Hello Ladies + Gentlemen, a signed OAuth request!";
var expected = "Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21";

Console.WriteLine(WebUtility.UrlEncode(input) == expected); // False
Console.WriteLine(Uri.EscapeUriString(input) == expected); // False
Console.WriteLine(Uri.EscapeDataString(input) == expected); // True

Я сейчас пытаюсь сделать то же самое в Дарт. Я перепробовал все методы кодирования в классе Uri, но, похоже, ни один из них не выдает того же.

Код: ( ДартПад)

print(Uri.encodeQueryComponent("Hello Ladies + Gentlemen, a signed OAuth request!"));
print(Uri.encodeFull("Hello Ladies + Gentlemen, a signed OAuth request!"));
print(Uri.encodeComponent("Hello Ladies + Gentlemen, a signed OAuth request!"));

Выход:

Hello+Ladies+%2B+Gentlemen%2C+a+signed+OAuth+request%21
Hello%20Ladies%20+%20Gentlemen,%20a%20signed%20OAuth%20request!
Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request!

Последний (encodeComponent) кажется самым близким, просто восклицательный знак ошибочен.

Есть ли существующий метод, который делает эту кодировку, как мне требуется (так же, как в C# EscapeDataString)?

2 ответа

Решение

Пакет преобразования работает отлично. Ранее была ошибка, приводившая к кодированию чисел, но исправление было объединено и выпущено сегодня в 2.0.1.

Я не могу найти функцию Dart, которая эквивалентна C# EscapeDataStringОднако, я думаю, что я смог реализовать один. Не стесняйтесь попробовать и посмотреть, если вы найдете какие-либо проблемы.

Смотрите этот Дартпад: https://dartpad.dartlang.org/4336dad4dc0603952a7c2e545cb8726c

Это основано на том факте, что Dart Docs говорит:

All characters except uppercase and lowercase letters, digits and the characters -_.!~*'() are percent-encoded.

Таким образом, предоставленные мной функции добавляют процентное кодирование этих конкретных символов.

Как я понимаю из документов C# на EscapeDataString он кодирует эти символы по умолчанию, тогда как никакая функция Dart, которую я смог найти, не делает этого.

Другие вопросы по тегам