PowerShell: преобразование хеш-таблицы в формат XML-RPC

Feb 05, 2023 13:13

Ранее в этой серии постов:
...
11. Общение с ЖЖ из PowerShell: простейшая аутентификация, получаю текст поста (интерфейс «flat»), ч.3
12. Общение с ЖЖ из PowerShell: простейшая аутентификация, получаю текст поста (интерфейс «XML-RPC»)

Окружение: операционная система «Windows 10», программа-оболочка «PowerShell» версии 7.

В предыдущем посте я отметил, что для меня становится проблемой составление тела HTTP(S)-запроса в формате XML вручную, так как при увеличении количества входных параметров приходится писать много XML-тегов вручную. В этом посте я опишу тестовый вариант функции, автоматизирующей эту задачу.

Исходная хеш-таблица

Я решил, что входные параметры для отправки ЖЖ («Живому Журналу») при работе через интерфейс «XML-RPC» должны быть подготовлены в том же виде, что и при использовании интерфейса «flat», то есть в виде хеш-таблицы. Вот пример исходной хеш-таблицы для HTTP(S)-запроса из предыдущего поста:

$inParams = @{
mode = "getevents"
username = "vbgtut"
password = "пароль"
selecttype = "one"
itemid = 148
ver = 1
}

Важно отметить, что отличия между хеш-таблицей с входными параметрами для работы через интерфейс «flat» и такой же хеш-таблицей для работы через интерфейс «XML-RPC» всё же могут быть. Дело в том, что через интерфейс «flat» мы можем передавать любые входные параметры в виде строк. А при передаче входных параметров через интерфейс «XML-RPC» предполагается, что мы будем указывать тип входного параметра.

В спецификации протокола «XML-RPC» типы передаваемых параметров делятся на две группы: составные и несоставные (по-английски «scalar»). В группу составных типов входят хеш-таблица (struct) и массив (array). В группу несоставных (scalar) типов входят целочисленный тип («int» или «i4»), логический тип (boolean), строковый тип (string), дробные числа (double), дата-время (dateTime.iso8601) и произвольные двоичные данные (base64).

Я пока что в своей тестовой функции преобразования хеш-таблицы в формат «XML-RPC» буду учитывать только целые числа и строки. Тип входного параметра в этой функции я буду определять по действительному типу конкретного параметра. В языке «PowerShell» тип переменной определяется при присвоении ей значения. Таким образом, если я указываю при присвоении значения переменной строковый литерал (значение в кавычках), то переменная примет тип (класс) «System.String». Если же я при присвоении значения переменной указываю числовой литерал (цифры без кавычек), переменная примет тип (класс) «System.Int32». Вот как это выглядит для нашего примера хеш-таблицы:

$inParams = @{
mode = "getevents" # System.String
username = "vbgtut" # System.String
password = "пароль" # System.String
selecttype = "one" # System.String
itemid = 148 # System.Int32
ver = 1 # System.Int32
}

Тестовая функция «toXML»

Вот код функции, который у меня получился:

function toXML($hashT) {
$xml = ''
$xml += ""
$xml += "LJ.XMLRPC." + $hashT["mode"] + ""
$xml += "

"
foreach ($key in $hashT.Keys) {
if ($key -ne "mode") {
$xml += ""
$xml += "" + $key + ""
$type = ($hashT[$key]).GetType().FullName
if ($type -eq "System.Int32") {$type = "int"} else {$type = "string"}
$xml += "<$type>" + $hashT[$key] + ""
$xml += ""
}
}
$xml += ""
$xml += ""
return $xml
}

Я не старался минимизировать размер кода, моя цель - получить читаемый, понятный код, в который позже можно будет легко внести изменения. Сравните этот код с текстом в формате XML, который я написал в предыдущем посте вручную для входных параметров.

Обратите внимание, что в первой строке этой функции в строковом литерале пришлось применить одинарные кавычки, так как внутри самого этого строкового литерала есть двойные кавычки:

$xml = ''

Если полученная функция «toXML» видит, что тип (класс) параметра - «System.Int32», то она оформляет этот параметр как целое число в формате «XML-RPC». В любом другом случае параметр будет оформлен как строка в формате «XML-RPC». Пока что мне этого достаточно.

Проверим работу функции «toXML» на примере хеш-таблицы, описанной выше в этом посте. Вот что у меня получилось:

$body = toXML($inParams)
$body

LJ.XMLRPC.getevents

passwordпарольselecttypeoneitemid148ver1usernamevbgtut

Это, конечно, неудобно для чтения человеком, но ЖЖ отлично разберется. Я проверил функцию «toXML» на задаче из предыдущего поста и у меня всё получилось: ЖЖ вернул запрошенный пост.

Инструмент, Образование, Сайтостроение, Программирование, Английский язык, ЖЖ

Previous post Next post
Up