Передача кириллицы в http запросе через curl

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение 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.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

Сообщение Игорь Столяров »

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)
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5168
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Передача кириллицы в http запросе через curl

Сообщение 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/.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

Сообщение Игорь Столяров »

kreator писал(а): 25 Июнь 2025, 22:24 Зачем такой изврат?
То что указанный Вами блогер, адаптирует до уровня своих читателей, в общем случае и называется RFC 1738 ... :D
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение 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
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

kreator писал(а): 25 Июнь 2025, 22:24
Игорь Столяров писал(а): 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/.
Уже написал, это с предварительным преобразованием в utf8. Тоже не работает.

Cannot find sign content at coordinates TypeNamedId=UniversalTransferDocument, Function=A1A7A4949E9F, Version=utd970_05_03_01, TitleIndex=1
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Странное значение в ответе в Function указывает, как через символ.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

Сообщение Игорь Столяров »

finsoftrz писал(а): 25 Июнь 2025, 22:34 Это и есть urlencode.
А мне вот придумка с "kodirovanie-i-dekodirovanie-url" больше нравится. Так сразу всё понятно ... :D

Если предположить, что Вы формируете сам запрос правильно - то есть 2 варианта:
1. Запросить тех. поддержку что бы они посмотрели, как Ваш запрос виден со стороны DIADOC;
2. Попробовать выполнить запрос через LibCurl - здесь хоть есть гарантия, что это работает (примеры у Вас есть).
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3296
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 50 раз
Контактная информация:

Передача кириллицы в http запросе через curl

Сообщение Дед Пахом »

Вроде бы опция --data-urlencode должна работать:
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Откуда информация, что через LibCurl это работает? Я практически уверен, что тоже нет.
Техподдержку придётся дёргать. Там проблема, что сервис массовый, и до тех, с кем можно что-то обсуждать, добраться непросто.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3296
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 50 раз
Контактная информация:

Передача кириллицы в http запросе через curl

Сообщение Дед Пахом »

Дед Пахом писал(а): 25 Июнь 2025, 23:46 Вроде бы опция --data-urlencode должна работать:
Хотя нет, это про кодировку данных, а не адреса.
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Я и --config пробовал подсунуть в utf8, не срабатывает. Гуглил вчера, этот вопрос и у других возникает, общее решение это преобразование части адреса с кириллицей через urlencode. Но этого мало, как я понимаю, значение параметра в адресе передается сервису как есть, и он уже определяет, как его интерпретировать. Судя по всему, диадок не делает обратное декодирование из urlencode.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

Сообщение Игорь Столяров »

finsoftrz писал(а): 26 Июнь 2025, 6:01 Гуглил вчера, этот вопрос и у других возникает
Классическая ошибка выжившего. Большинство сделали интеграцию и молча работают.
У те у кого есть какие-то проблемы ищут помощи у коллег в интернете ... :D
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 и т.д. 🤦‍♀️
Мухи отдельно, котлеты отдельно ! :D

P/S: Код формирования пакета с запросом не критиковать, он очень старый.
Тогда ещё массивы значений приходилось формировать вручную.
Сейчас автор cJSON работу с массивами упростил на порядок - за что ему отдельное огромное спасибо ! 👍
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5283
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Передача кириллицы в http запросе через curl

Сообщение finsoftrz »

Игорь, Вы не поняли. Я уже работаю с сервисом Диадока. Запросы на получение информации, подпись при отправке сообщений. Например, отказ от подтверждения документов у меня работает, в нем данные подписываются открепленной подписью, тело сообщения переводится в base64. Это все работает. Затык именно в кириллице в строке адреса. Curl передает ее в ansi, а Диадок, видимо, ждет только в utf8.

Запросы я тестирую не из приложения, а из командной строки, чтобы не накладывались какие-то дополнительные нюансы. Про postman я знаю, просто у меня много всякой работы с внешними сервисами происходит именно через curl, и проблем особых не возникало.

Сейчас ответила техподдержка. Сказали, что консультации по таким вопросам платные. :facepalm:
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8066
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Передача кириллицы в http запросе через curl

Сообщение Игорь Столяров »

finsoftrz писал(а): 26 Июнь 2025, 8:32 Сказали, что консультации по таким вопросам платные
О времена ! Хотите узнать как почему не работает наш сервис - оформляёте подписку ! :D
Ну хоть не стали писать чушь собачью через месяц, как мне с Ingasoft EasyOpenOffice. 🤦‍♀️
finsoftrz писал(а): 26 Июнь 2025, 8:32 Затык именно в кириллице в строке адреса
Да. DIADOC ждёт параметры в UTF-8.
И может получиться так, что для командной строки здесь нет решения. 🤷‍♀️

Поэтому я бы хотел увидеть работающий запрос, а потом уже переводить его на своё видение выполнения.
Кстати, это не моя идея - так мне сказали делать в тех. поддержке Сбера при настройке СБП. Пока бесплатно. :D
Make Clarion Great Again ! 😎
Ответить