Страница 1 из 3
LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 7:36
Игорь Столяров
Добрый день !
Есть проблема с прохождением сформированного запроса.
Тех. поддержка сервиса просит показать полный текст сформированного запроса перед отправкой.
Что-то вроде:
Код: Выделить всё
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() ?
Заранее спасибо за помощь ...

LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 10:09
Admin
в dbgview64.exe посмотри. там много инфы
LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 11:37
PavelNK
Fiddler
LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 15:21
Игорь Столяров
Ага ! Т.е. вывести и посмотреть (или сохранить) сформированный запрос методами класса низя ...

LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 15:36
PavelNK
Игорь Столяров писал(а): 13 Октябрь 2022, 15:21
Ага ! Т.е. вывести и посмотреть (или сохранить) сформированный запрос методами класса низя ...
Даже если можно, то ты увидишь то, что ты сформировал, а не то что отправил
LibCurl: Отладка запроса
Добавлено: 13 Октябрь 2022, 17:38
finsoftrz
Можно через curl отладить запрос, а потом в curlib пробовать, если очень хочется этот класс юзать. Как минимум, будете на одном языке с техподдержкой разговаривать, так как curl знают все, а curlib единицы. Если curl отработал как надо, то проблема уже в своем коде, все передаваемые значения выяснены.
LibCurl: Отладка запроса
Добавлено: 14 Октябрь 2022, 20:30
SergioRaguzini
Привет Всем!
С помощью curl.exe можно получить ответ в json-файл, но потом, чтобы посмотреть в кириллице - приходится использовать, например, Notepad++ или иной инструментарий
А есть ли какая-то возможность, м.б. с помощью некой внешней dll или даже утилиты коммандной строки преобразовать ответ в кириллицу и распрасить, чтобы уже как-то использовать в программе (вопрос именно применительно к использованию curl.exe)
Спасибо
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 15:19
SergioRaguzini

- libcurl_erors.png (9.12 КБ) 11356 просмотров
Привет всем!
Использую класс 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") для исключения такого аварийного "вылета"?
Спасибо
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 16:17
Admin
Вот эти 147, 148 кто дает? Апишка? Это какие то кастомные ошибки.
Стандартные как бы тут
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 16:21
Дед Пахом
Вы смешиваете код ошибки libcurl (curl.StrError(SELF.res)) и код возврата сервера (curl.GetResponseCODE()). "http response code said error" это ошибка запроса CURLE_HTTP_RETURNED_ERROR (22), то есть до сервера запрос не доходит, и GetResponseCODE видимо возвращает какой-то мусор, потому что в этом случае код возврата не имеет смысла - никакого кода сервер не прислал.
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 17:43
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), можно ли было такое делать?
Спасибо
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 18:02
Дед Пахом
Если 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)
LibCurl: Отладка запроса
Добавлено: 01 Ноябрь 2022, 19:06
SergioRaguzini
Дейтсвительно, "
CURLE_OK" - очень разумно! Посмотрел в своих других процедурах - он у меня в некоторых используется...
Признаюсь, я совсем недавно (и то не без помощи форумчан и статей нашего форума) стал собирать рабочие приложения
rest-api с использованием класса
Libcurl, поэтому пока частенько туплю
Благодарю всех откликнувшихся
Дед Пахом писал(а): 01 Ноябрь 2022, 18:02
Если SELF.res = CURLE_OK, то GetResponseCODE() и всё остальное имеет смысл, иначе не имеет.
...
...
LibCurl: Отладка запроса
Добавлено: 19 Ноябрь 2022, 16:52
Игорь Столяров
Если позволите, 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") ?
Спасибо.
LibCurl: Отладка запроса
Добавлено: 19 Ноябрь 2022, 17:53
Дед Пахом
Вроде бы это первый заголовок (header), полученный от сервера. Можно перегрузить метод HeaderCallback и там парсить, если это первый вызов.
Код: Выделить всё
MyCurl.HeaderCallback PROCEDURE(STRING pHeaderLine)
CODE
if firstCall
ParseHttpHeader(pHeaderLine)
firstCall = false
end
И надо явно указать, что мы будем читать заголовки: