Страница 1 из 5
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 21:27
finsoftrz
Вопрос не совсем про кларион, но из него.
Мучаюсь с Диадоком (ЭДО). Эти странные люди почему-то решили называть функции кириллической аббревиатурой. В результате чего надо передавать это в качестве параметров некоторых http запросов. В частности, в таком виде.
Код: Выделить всё
curl.exe -X GET "https://diadoc-api.kontur.ru/GetContent?TypeNamedId=UniversalTransferDocument&function=СЧФДОП&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd" -H "Content-Type: application/xml charset=utf-8" -H "Connection: Keep-Alive" -H "Accept: application/xml" -H "Authorization: DiadocAuth ddauth_api_client_id=<ид апи>,ddauth_token=<токен>" -o edo_diad_in.xml
То есть, проблема в &function=СЧФДОП. Этот запрос ничего не возвращает, а так должен возвращать файл с xsd схемой. Если функция имеет значение на латинице (у другого вида документов), то запрос работает. Я пробовал, конечно, преобразовывать urlencode, в utf8, но, судя по всему, они принимают значение как есть, без обратного преобразования. То есть ответ появляется, и в нем сообщение, что такая функция не найдена, со значением в urlencode.
Вот решил спросить здесь, вдруг кто сталкивался с подобным вопросом. Общаться с эшелонированной техподдержкой Диадока много времени и нервов уходит. Есть в запасе еще вариант сделать прокладку на php, но хотелось бы обойтись обычным curl.exe.
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 21:47
Игорь Столяров
finsoftrz писал(а): 25 Июнь 2025, 21:27
преобразовывать urlencode, в utf8
ДД !
Неть. Для этих целей нужно использовать кодировку RFC 1738 - класс PrintF умеет с ней работать.
Но сразу хочу честно сказать, что сказанное ниже есстественно относится к классу LibCurl, а не к запуску Curl.exe.
Код: Выделить всё
sCIS = 'РУКОД-01234'
lResult = Self.Curl.SendRequest('http://127.0.0.1:5995/api/v1/cis/outCheck?cis=' & printf('%u',sCIS),,Self.ResponseBuffer)
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:24
kreator
Игорь Столяров писал(а): 25 Июнь 2025, 21:47
Неть. Для этих целей нужно использовать кодировку RFC 1738
Интересно. Зачем такой изврат?
СЧФДОП - %D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F. Вот сюда -
https://seogift.ru/tools/kodirovanie-i- ... vanie-url/.
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:29
Игорь Столяров
kreator писал(а): 25 Июнь 2025, 22:24
Зачем такой изврат?
То что указанный Вами блогер, адаптирует до уровня своих читателей, в общем случае и называется RFC 1738 ...

Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:34
finsoftrz
Игорь Столяров писал(а): 25 Июнь 2025, 21:47
finsoftrz писал(а): 25 Июнь 2025, 21:27
преобразовывать urlencode, в utf8
ДД !
Неть. Для этих целей нужно использовать кодировку RFC 1738 - класс PrintF умеет с ней работать.
Но сразу хочу честно сказать, что сказанное ниже есстественно относится к классу LibCurl, а не к запуску Curl.exe.
Код: Выделить всё
sCIS = 'РУКОД-01234'
lResult = Self.Curl.SendRequest('http://127.0.0.1:5995/api/v1/cis/outCheck?cis=' & printf('%u',sCIS),,Self.ResponseBuffer)
Это и есть urlencode. Я пробовал и просто в него (значение идентичное), и вначале в utf8, потом в urlencode, не работает. Возвращает, как написал.
Значение после кодировки СЧФДОП = %D1%D7%D4%C4%CE%CF. А возвращает как-то странно. Аналогично после предварительного преобразования в utf8, там только строка в 2 раза длиннее.
Код: Выделить всё
Cannot find sign content at coordinates TypeNamedId=UniversalTransferDocument, Function=D7C4CF, Version=utd970_05_03_01, TitleIndex=1
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:34
finsoftrz
Уже написал, это с предварительным преобразованием в utf8. Тоже не работает.
Cannot find sign content at coordinates TypeNamedId=UniversalTransferDocument, Function=A1A7A4949E9F, Version=utd970_05_03_01, TitleIndex=1
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:38
finsoftrz
Странное значение в ответе в Function указывает, как через символ.
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 22:50
Игорь Столяров
finsoftrz писал(а): 25 Июнь 2025, 22:34
Это и есть urlencode.
А мне вот придумка с "kodirovanie-i-dekodirovanie-url" больше нравится. Так сразу всё понятно ...
Если предположить, что Вы формируете сам запрос правильно - то есть 2 варианта:
1. Запросить тех. поддержку что бы они посмотрели, как Ваш запрос виден со стороны DIADOC;
2. Попробовать выполнить запрос через LibCurl - здесь хоть есть гарантия, что это работает (примеры у Вас есть).
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 23:46
Дед Пахом
Вроде бы опция
--data-urlencode должна работать:
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 23:50
finsoftrz
Откуда информация, что через LibCurl это работает? Я практически уверен, что тоже нет.
Техподдержку придётся дёргать. Там проблема, что сервис массовый, и до тех, с кем можно что-то обсуждать, добраться непросто.
Передача кириллицы в http запросе через curl
Добавлено: 25 Июнь 2025, 23:56
Дед Пахом
Хотя нет, это про кодировку данных, а не адреса.
Передача кириллицы в http запросе через curl
Добавлено: 26 Июнь 2025, 6:01
finsoftrz
Я и --config пробовал подсунуть в utf8, не срабатывает. Гуглил вчера, этот вопрос и у других возникает, общее решение это преобразование части адреса с кириллицей через urlencode. Но этого мало, как я понимаю, значение параметра в адресе передается сервису как есть, и он уже определяет, как его интерпретировать. Судя по всему, диадок не делает обратное декодирование из urlencode.
Передача кириллицы в http запросе через curl
Добавлено: 26 Июнь 2025, 7:39
Игорь Столяров
finsoftrz писал(а): 26 Июнь 2025, 6:01
Гуглил вчера, этот вопрос и у других возникает
Классическая ошибка выжившего. Большинство сделали интеграцию и молча работают.
У те у кого есть какие-то проблемы ищут помощи у коллег в интернете ...
finsoftrz писал(а): 25 Июнь 2025, 23:50
Откуда информация, что через LibCurl это работает?
Потому что я никогда как-то особо не кодировал ДАННЫЕ для DIADOC и всё прекрасно работает.
Попробуйте, для теста, подсунуть имя пакета с русскими символами и посмотреть воспримет ли это сервис.
Код: Выделить всё
Case qFileDocument.TypeNamedId ! --- В зависимости от вида документа
Of 'ProformaInvoice' ! Для счёта в произвольном формате
qDocumentAttachments.Metadata = |
'[{{"Key":"FileName", "Value":' & json::ToUtf8(Self.EscapeString(Self.GetFileName(qFileDocument.FullName))) & '},' & |
'{{"Key":"DocumentNumber", "Value":' & json::ToUtf8(Self.EscapeString(qFileDocument.DocumentNumber)) & '},' & |
'{{"Key":"DocumentDate", "Value":"' & Format(qFileDocument.DocumentDate,@d06.) & '"},' & |
'{{"Key":"TotalSum", "Value":"' & Clip(Left(Format(qFileDocument.TotalSum,@n_13.2))) & '"}]'
Of 'UniversalTransferDocument' ! Для ЭДО УПД в XML
qDocumentAttachments.Metadata = '[]'
end
Брезгуете работать с LibCurl, работайте как белые люди с POSTMAN.
Но так или иначе - получите для начала адекватный ответ сервиса на REST запрос с Вашими данными.
А потом уже переходите к запуску EXE с параметрами из командной строки через API в Win x64 и т.д.

Мухи отдельно, котлеты отдельно !
P/S: Код формирования пакета с запросом не критиковать, он очень старый.
Тогда ещё массивы значений приходилось формировать вручную.
Сейчас автор cJSON работу с массивами упростил на порядок - за что ему отдельное огромное спасибо !

Передача кириллицы в http запросе через curl
Добавлено: 26 Июнь 2025, 8:32
finsoftrz
Игорь, Вы не поняли. Я уже работаю с сервисом Диадока. Запросы на получение информации, подпись при отправке сообщений. Например, отказ от подтверждения документов у меня работает, в нем данные подписываются открепленной подписью, тело сообщения переводится в base64. Это все работает. Затык именно в кириллице в строке адреса. Curl передает ее в ansi, а Диадок, видимо, ждет только в utf8.
Запросы я тестирую не из приложения, а из командной строки, чтобы не накладывались какие-то дополнительные нюансы. Про postman я знаю, просто у меня много всякой работы с внешними сервисами происходит именно через curl, и проблем особых не возникало.
Сейчас ответила техподдержка. Сказали, что консультации по таким вопросам платные.

Передача кириллицы в http запросе через curl
Добавлено: 26 Июнь 2025, 8:50
Игорь Столяров
finsoftrz писал(а): 26 Июнь 2025, 8:32
Сказали, что консультации по таким вопросам платные
О времена ! Хотите узнать как почему не работает наш сервис - оформляёте подписку !
Ну хоть не стали писать чушь собачью через месяц, как мне с Ingasoft EasyOpenOffice.
finsoftrz писал(а): 26 Июнь 2025, 8:32
Затык именно в кириллице в строке адреса
Да. DIADOC ждёт параметры в UTF-8.
И может получиться так, что для командной строки здесь нет решения.
Поэтому я бы хотел увидеть работающий запрос, а потом уже переводить его на своё видение выполнения.
Кстати, это не моя идея - так мне сказали делать в тех. поддержке Сбера при настройке СБП. Пока бесплатно.
