LibCurl: Отладка запроса

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

LibCurl: Отладка запроса

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

Добрый день !

Есть проблема с прохождением сформированного запроса.
Тех. поддержка сервиса просит показать полный текст сформированного запроса перед отправкой.
Что-то вроде:

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

POST  https://api.sberbank.ru:8443/prod/tokens/v2/oauth
-H "accept: application/json"
-H "authorization: Basic ZjhjM2RkMTEtM2JhNy00YWExLWFlNzctZGY3NTNlMzY1ZmI3OiBHNnhGM2VTMGVVNGlYNXRQOG5EN2hTNmtFMWpEM3NMNXFQMGRPNXRDMGpNMGpRN2tZMQ=="
-H "content-type: application/x-www-form-urlencoded"
-H "rquid: 25Ec70328e2CE4DF39e828E1dF75EFa0"
-H "x-ibm-client-id: f8c3dd11-3ba7-4aa1-ae77-df753e365fb7"
-d "grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create" 
Есть ли какая-нибудь отладочная функция (Debug ?) просмотра запроса перед отправкой Curl.SendRequest() ?
Заранее спасибо за помощь ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

LibCurl: Отладка запроса

Сообщение Admin »

в dbgview64.exe посмотри. там много инфы
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

LibCurl: Отладка запроса

Сообщение PavelNK »

Fiddler
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

LibCurl: Отладка запроса

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

Ага ! Т.е. вывести и посмотреть (или сохранить) сформированный запрос методами класса низя ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

LibCurl: Отладка запроса

Сообщение PavelNK »

Игорь Столяров писал(а): 13 Октябрь 2022, 15:21 Ага ! Т.е. вывести и посмотреть (или сохранить) сформированный запрос методами класса низя ... :(
Даже если можно, то ты увидишь то, что ты сформировал, а не то что отправил
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

LibCurl: Отладка запроса

Сообщение finsoftrz »

Можно через curl отладить запрос, а потом в curlib пробовать, если очень хочется этот класс юзать. Как минимум, будете на одном языке с техподдержкой разговаривать, так как curl знают все, а curlib единицы. Если curl отработал как надо, то проблема уже в своем коде, все передаваемые значения выяснены.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

LibCurl: Отладка запроса

Сообщение SergioRaguzini »

Привет Всем!

С помощью curl.exe можно получить ответ в json-файл, но потом, чтобы посмотреть в кириллице - приходится использовать, например, Notepad++ или иной инструментарий
А есть ли какая-то возможность, м.б. с помощью некой внешней dll или даже утилиты коммандной строки преобразовать ответ в кириллицу и распрасить, чтобы уже как-то использовать в программе (вопрос именно применительно к использованию curl.exe)

Спасибо
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

LibCurl: Отладка запроса

Сообщение SergioRaguzini »

libcurl_erors.png
libcurl_erors.png (9.12 КБ) 1446 просмотров
Привет всем!

Использую класс Libcurl для rest-обработки. Сегодня сайт к api которого по таймеру обращается приложение на C6.3 abc "лег" и в ответ на запрос стали приходить ошибки

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

                respBuffer  = SELF.GetREST('orders/')
      If CLIP(respBuffer) = ''
             SELF.Err_Code  = CLIP(SELF.curl.GetResponseCODE())
             SELF.Err_Descr = CLIP(SELF.curl.StrError(SELF.res))
    else
    ! что-то делаем c json
... 
  end 

   
т.е.значение переменной SELF.Err_Code заполняется кодом ошибки при выполнении метода GetREST, например:

0 - No header
147, 148, 244, 246, 248 - HTTP response code said Error
200 - No error

Прошу подсказки уважаемого сообщества где можно посмотреть расшифровку таких номеров ошибок.

Приложение работает в трее в круглосуточном режиме с настраиваемым (5-ти минутным) циклом таймера уже более года и все было Ok, ошибок в ответе на GET-запрос практически никогда не было до сегодняшнего дня. Однако, сегодня при массовых ошибках добавилась еще проблема "вылета" приложения при очередном цикле (когда предыдущий вызов также вернул ошибку, может раз 10 отработать ошибку нормально, а потом "вылететь", а может уже на втором цикле с ошибкой), т.е. приложение стало нештатно закрываться без каких-либо уведомлений.
Посоветуйте, что-то можно использовать дополнительно (некий "Clear") для исключения такого аварийного "вылета"?

Спасибо
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

LibCurl: Отладка запроса

Сообщение Admin »

Вот эти 147, 148 кто дает? Апишка? Это какие то кастомные ошибки.
Стандартные как бы тут https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

LibCurl: Отладка запроса

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

Вы смешиваете код ошибки libcurl (curl.StrError(SELF.res)) и код возврата сервера (curl.GetResponseCODE()). "http response code said error" это ошибка запроса CURLE_HTTP_RETURNED_ERROR (22), то есть до сервера запрос не доходит, и GetResponseCODE видимо возвращает какой-то мусор, потому что в этом случае код возврата не имеет смысла - никакого кода сервер не прислал.
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

LibCurl: Отладка запроса

Сообщение SergioRaguzini »

Коллеги, Спасибо за оперативный отклик!
Дед Пахом писал(а): 01 Ноябрь 2022, 16:21 ...
"http response code said error" это ошибка запроса CURLE_HTTP_RETURNED_ERROR (22), то есть до сервера запрос не доходит, и GetResponseCODE видимо возвращает какой-то мусор, потому что в этом случае код возврата не имеет смысла - никакого кода сервер не прислал.
Логично ли в начале проанализировать содержимое curl.StrError(SELF.res) и, если его значение не равно 'http response code said error'

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

   If CLIP(respBuffer) = ''
            SELF.Err_Descr = CLIP(SELF.curl.StrError(SELF.res))
	 if SELF.Err_Descr <> 'HTTP response code said Error'		
   	             SELF.Err_Code  = CLIP(SELF.curl.GetResponseCODE())
	end      
    Else
    ! что-то делаем c json, например:
		 ConvertCharSet(respBuffer, 65001, 1251)
                 json.DoNotUnEscape = 1                                      
                 json.FromJSon(respBuffer, JSResp)
                 json.FromJSon(JSResp.data.orderList, OrdersQ)		! получить в очередь    
	...
  End 
то толко тогда уже использовать SELF.Err_Code = CLIP(SELF.curl.GetResponseCODE()) ?

Как быть в случае когда на GET-запрос respBuffer = SELF.GetREST('orders/') пришел ответ <> '', но не в виде корректного json, а "мусора".
Возможно ли, как-то это понять, что ответ не "мусорный" (который, м.б. и вызвает в моей ситуации аварийный "вылет" программы
), а корректный json, правильным ли будет, в таком случае, анализ очереди (у меня это OrdersQ) по принципу:
if RECORDS(OrdersQ), то считаем что в ответе не "мусор"

В тех примерах, которые со мной поделились форумчане, размерность переменной respBuffer в которую получем ответ запроса была STRING(655360)
я увеличил ее в три раза до STRING(1966080), можно ли было такое делать?

Спасибо



Admin писал(а): 01 Ноябрь 2022, 16:17 ...
Стандартные как бы тут https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

LibCurl: Отладка запроса

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

Если SELF.res = CURLE_OK, то GetResponseCODE() и всё остальное имеет смысл, иначе не имеет.
SergioRaguzini писал(а): 01 Ноябрь 2022, 17:43 В тех примерах, которые со мной поделились форумчане, размерность переменной respBuffer в которую получем ответ запроса была STRING(655360)
я увеличил ее в три раза до STRING(1966080), можно ли было такое делать?
Можно же использовать динамическую строку IDynStr, пример есть в\libcurl\examples\Google Translate\google_translate_lite.clw. Если коротко:

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

hresp                           &IDynStr
  CODE
  hresp &= NewDynStr()
  res = curl.SendRequest(url, , hresp)
  IF res <> CURLE_OK
    !- connection error
    MESSAGE(curl.StrError(res))
  ELSIF curl.GetResponseCode() <> 200
    !- http error (for example, error 429 (Too many requests)))
  ELSE
    !- success, parse json response
    jroot &= jf.Parse(hresp.Str())
  END

  !- cleanup
  hresp.Kill()
  DisposeDynStr(hresp)
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

LibCurl: Отладка запроса

Сообщение SergioRaguzini »

Дейтсвительно, "CURLE_OK" - очень разумно! Посмотрел в своих других процедурах - он у меня в некоторых используется...
Признаюсь, я совсем недавно (и то не без помощи форумчан и статей нашего форума) стал собирать рабочие приложения rest-api с использованием класса Libcurl, поэтому пока частенько туплю :facepalm:

Благодарю всех откликнувшихся

:ty:

Дед Пахом писал(а): 01 Ноябрь 2022, 18:02 Если SELF.res = CURLE_OK, то GetResponseCODE() и всё остальное имеет смысл, иначе не имеет.
...
...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7332
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

LibCurl: Отладка запроса

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

Если позволите, up-ну тему ...
Ситуация: запрос проходит (CURL_OK), но сервис возвращает ошибку в заголовке:
HTTP / 1.1 504 Gateway Timeout
Server: nginx / 1.20.1
Date: Thu, 03 Feb 2022 14: 14: 06 GMT
Тогда GetResponseCode() вернёт код ошибки 504.
А можно (ли как-то) из этого же заголовка отжать текст ошибки ("Gateway Timeout") ?
Спасибо.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

LibCurl: Отладка запроса

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

Вроде бы это первый заголовок (header), полученный от сервера. Можно перегрузить метод HeaderCallback и там парсить, если это первый вызов.

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

MyCurl.HeaderCallback     PROCEDURE(STRING pHeaderLine)
  CODE
  if firstCall
    ParseHttpHeader(pHeaderLine)
    firstCall = false
  end
И надо явно указать, что мы будем читать заголовки:

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

  MyCurl.Init()
  MyCurl.SetHeaderCallback()
С уважением, ДП
Ответить