Страница 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
На моих данных (без русского значения) - ответ нормальный, но без русского параметра неинтересный:

1.jpg

Дальше Игорь тупо делает Ваш запрос из первого сообщения (XSD схемы это ведь не конфеденциальные данные):

Код: Выделить всё

  If xMyDia.GetContent('/GetContent?TypeNamedId=UniversalTransferDocument&function=' & printf('%u','СЧФДОП') & '&version=utd970_05_03_01&titleIndex=1&contentType=SignerUserContractXsd').
и без проблем получает результат - см. прикреплённый файл XSD.TXT. Вопросы ? :D

Передача кириллицы в 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, чтобы было в ответе видно, что он именно на этот запрос.
Без проблем. Запрос как выше, ответ прикреплён к сообщению (я правда не понял, что изменилось).
И мне кажется, что Вам уже можно переходить от общего руководства - непосредственно к работе. :D

Передача кириллицы в 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?
В предыдущем сообщении строка запроса и ответ сервиса на неё.
Для того, что бы как-то прокомментировать, что там должно быть или поддержать разговор - нужно уже смотреть описание.
Удачи Вам в этой работе ! :D
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. :cat:

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

Добавлено: 28 Июнь 2025, 15:53
finsoftrz
То есть, Диадок тут действительно ни при чем, проблема была в синтаксисе командной строки curl. Причем в интернете информации не нашел. На мысль навело то, что при передаче с одинарным % сервис возвращает сообщение о значении, в котором символы приняты через один.

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

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

Передача кириллицы в 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. :lol:
Касаемо через чего работать, через 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=ЙЦУКЕНГ без кодировки.