Страница 4 из 5
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 8:57
Игорь Столяров
OK ! Я сейчас попробую сделать метод и хоть что-то получить из GetContent() по своей ссылке.
Должна же она что-то вернуть. Результат сообщу и покажу код метода. А Вы уже попробуете свои данные тогда.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 9:10
finsoftrz
С default работает. А с кириллическим названием ничего не возвращает.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 9:46
Игорь Столяров
finsoftrz писал(а): 28 Июнь 2025, 9:10
А с кириллическим названием ничего не возвращает
Да. Это мы ещё вчера поняли - но Вы работаете через командную строку CURL.EXE
И так как Вам вилы самому сделать тест через вызов LibCurl - то это сделал я:
Код: Выделить всё
! Получить XSD-схему документа (тест)
DiaDocClass.GetContent Procedure(String sQueryPar) !,Long
Result CurlCode
json cJSONFactory
Root &cJson
Code
If Self.PriorCurl('GET',Result)
Self.ResponseBuffer.Kill
Result = Self.Curl.SendRequest('https://diadoc-api.kontur.ru' & sQueryPar, Self.ResponseBuffer)
Self.Debug('GetContent_Response.json', Self.ResponseBuffer, CP_UTF8) ! Запись протокола отладки
If Self.CheckResponse(Result,'Ошибка метода GetContent')
!Root &= json.Parse(Self.ResponseBuffer,CP_ACP) - не нужно, т.к. в ответе не JSON, а XSD !
!If Not (Root &= Null)
! Message(Root.ToString(True)) ! Здесь парсим ответ сервиса
! Root.Delete()
!end
end
end
Return Result
На моих данных (без русского значения) - ответ нормальный, но без русского параметра неинтересный:
Дальше Игорь тупо делает Ваш запрос из первого сообщения (XSD схемы это ведь не конфеденциальные данные):
Код: Выделить всё
If xMyDia.GetContent('/GetContent?TypeNamedId=UniversalTransferDocument&function=' & printf('%u','СЧФДОП') & '&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd').
и без проблем получает результат - см. прикреплённый файл XSD.TXT. Вопросы ?

Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 11:32
finsoftrz
Можете указать полную строку запроса, с учётом результата printf? И какие значения установлены в заголовке запроса? Попробуйте ещё с titleIndex=0, чтобы было в ответе видно, что он именно на этот запрос.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 11:53
Игорь Столяров
Строку запроса Вам подсказывал KREATOR:
Код: Выделить всё
If xMyDia.GetContent('/GetContent?TypeNamedId=UniversalTransferDocument&function=' & '%D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F' & '&version=utd970_05_03_01&titleIndex=0&contentType=SignerUserContractXsd').
Но здесь наверно правильно искать значение между "&function=" и следующим "&" и конвертировать в RFC 1738.
Потому что все эти ручные перекодирования и "текстушки" рухнут при любом шаге сервиса в сторону ...
finsoftrz писал(а): 28 Июнь 2025, 11:32
Попробуйте ещё с titleIndex=0, чтобы было в ответе видно, что он именно на этот запрос.
Без проблем. Запрос как выше, ответ прикреплён к сообщению (я правда не понял, что изменилось).
И мне кажется, что Вам уже можно переходить от общего руководства - непосредственно к работе.

Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 12:19
finsoftrz
Странно, это стандартное значение urlencode, у меня оно не работало. Игорь, а Вы точно уверены, что во вложении ответ на titleIndex=0? Там должна быть схема на упд, а это выглядит как схема на ответный титул покупателя.
В любом случае спасибо за усилия, перепроверю ещё раз. Хоть я и обошёл проблему, но выяснить до конца надо бы.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 12:49
finsoftrz
По подписи так и должно быть, задан contentType=SignerUserContractXsd. Запросы идентичные с адресной строкой в ansi, а результат разный.
А какая у Вас версия curlib?
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 12:58
Игорь Столяров
finsoftrz писал(а): 28 Июнь 2025, 12:19
а Вы точно уверены, что во вложении ответ на titleIndex=0?
В предыдущем сообщении строка запроса и ответ сервиса на неё.
Для того, что бы как-то прокомментировать, что там должно быть или поддержать разговор - нужно уже смотреть описание.
Удачи Вам в этой работе !
finsoftrz писал(а): 28 Июнь 2025, 12:19
А какая у Вас версия curlib?
Текущий комплект предлагаемый автором класса.
см.
https://github.com/mikeduglas/libcurl/
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 15:42
finsoftrz
Уф, поймал наконец. Кто бы мог подумать...
Надо дублировать символ "%". То есть, вместо function=%D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F писать function=%%D0%%A1%%D0%%A7%%D0%%A4%%D0%%94%%D0%%9E%%D0%%9F.

Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 15:53
finsoftrz
То есть, Диадок тут действительно ни при чем, проблема была в синтаксисе командной строки curl. Причем в интернете информации не нашел. На мысль навело то, что при передаче с одинарным % сервис возвращает сообщение о значении, в котором символы приняты через один.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 17:25
Игорь Столяров
Игорь Столяров писал(а): 27 Июнь 2025, 21:35
Это вопрос к CURL.EXE. Кроме частичного перебора методом тыка, должно быть какое-то описание по передаче параметров
в национальной кодировке из командной строки ...
Ну в принципе, что-то в этом стиле и ожидалось.
Записывайте где-нибудь эти тайные знания, Вам уже можно открывать лавку древностей Clarion.

Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 18:03
Дед Пахом
The solution is to use the -G switch in combination with the --data-urlencode switch. Using the original example, the command would look like the following:
$ curl -X PUT -G '
http://example.com/resource/1' --data-urlencode 'param1=value 1' --data-urlencode param2=value2
The -G switch causes the parameters encoded with the --data-urlencode switches to be appended to the end of the http URL with a ? separator.
То есть надо добавить опцию -G, а параметры передавать отдельно, каждый с опцией -data-urlencode, тогда они добавятся в конец адреса после символа ?, разделённые символом &.
Взял здесь:
https://stackoverflow.com/questions/329 ... n-http-put
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 18:23
finsoftrz
Причем тут лавка древностей? Мне кажется, я сильно модней, чем Вы, так как умею ip драйвер, anysceen, могу на ntws сбацать, могу на php.
Касаемо через чего работать, через curl.exe или curlib, по большому счету, принципиальной разницы нет, функционал идентичный. Через curl.exe точно проще, так как не нужна навороченная интерфейсная прослойка. Михаил в ней много сделал (я даже удивляюсь, как такой серьезный проект делается на шару), но если что, разбираться в сырцах не так просто будет, людей работает мало с ней. Плюс еще это работа с вебом и там достаточно быстро меняется. Что, если завтра некоторые вещи станут доступны только в 64 битах, менять концепцию? Это не только curlib касается. Если есть возможность использовать более простые и распространенные инструменты, то я предпочитаю их. Если будет достаточное обоснование использовать редкие библиотеки (тот же интерфейс к curlib), то буду смотреть в эту сторону. Например, anyscreen редкая вещь и работает не все там, но она дает принципиальную возможность обеспечить легкий интерфейс к данным основной системы через интернет, включая мобильные устройства, значит, увеличивает наши возможности и делает нас сильнее.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 18:25
finsoftrz
Дед Пахом писал(а): 28 Июнь 2025, 18:03
The solution is to use the -G switch in combination with the --data-urlencode switch. Using the original example, the command would look like the following:
$ curl -X PUT -G '
http://example.com/resource/1' --data-urlencode 'param1=value 1' --data-urlencode param2=value2
The -G switch causes the parameters encoded with the --data-urlencode switches to be appended to the end of the http URL with a ? separator.
То есть надо добавить опцию -G, а параметры передавать отдельно, каждый с опцией -data-urlencode, тогда они добавятся в конец адреса после символа ?, разделённые символом &.
Взял здесь:
https://stackoverflow.com/questions/329 ... n-http-put
Проверял, не работает. Это дает тот же результат, как напрямую подставить в параметр значение в urlencode. Помогло только дублирование символов % в нем.
Передача кириллицы в http запросе через curl
Добавлено: 28 Июнь 2025, 18:45
Дед Пахом
Надо --data-urlencode value1=ЙЦУКЕНГ без кодировки.