Страница 2 из 3
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 16:03
SergioRaguzini
Привет Всем!
Есть некий API c описанием возможных ошибок возвращаемых сервером,
я посылаю POST, добавляя (в моем примере) новую персону:
Код: Выделить всё
SELF.curl.SetCustomRequest('POST')
RequestValue = CLIP(JSON.ToJSON(Person))
ConvertCharSet(RequestValue, 1251, 65001)
JSON.DoNotUnEscape = 1
SELF.res = SELF.curl.SendRequestStr(CLIP(SELF.url) & 'persons/', RequestValue, respBuffer)
JSON.DoNotUnEscape = 0
respBuffer заполняется содержимым ответа при условии
If SELF.res = CURLE_OK
Вроде бы это логично, однако, если сделать этот же запрос, но через cURL или Postman, то не смотря, например на наличие ошибки "
400 - BadRequest" там возвращается ответ:
Код: Выделить всё
{
"response": {
"date": "2022-11-26 15:53:14",
"status": "error",
"errors": {
"validation": {
"phone": [
"Phone already exists"
]
}
}
}
}
и это явно пригодлось бы для понимания ситуации, а в моем случае, при возврате 400-й ошибки в
respBuffer пусто
Я, конечно, пробовал посмотреть содержимое
respBuffer и до условия
If SELF.res = CURLE_OK, но пусто там...
Прошу "не кидать тапками" за возможно глупый вопрос, но можно ли получить также как в CURL?
Спасибо
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 16:14
Игорь Столяров
Как я понимаю, это иное.
SELF.res <> CURLE_OK - результат выполнение запроса. Нет подключения к интернет, сервис не доступен и т.д..
400 BadRequest - ошибка в заголовке ответа, который вернул сервис (нет доступа, ошибка данных в запросе и т.д.)
Тогда в тушке ответа действительно могут быть какие-то поясняющие данные.
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 16:34
SergioRaguzini
Игорь Столяров писал(а): 26 Ноябрь 2022, 16:14
SELF.res <> CURLE_OK - результат выполнение запроса. Нет подключения к интернет, сервис не доступен и т.д..
Да, так и есть, но если например, я добавляю уникальное значение ФИО и номер телефона, то получаю в
respBuffer корректный ответ:
Код: Выделить всё
"response": {
"date": "2022-11-26 15:40:05",
"status": "success",
"data": {
"id": "fc2ff532-d176-4b3b-983e-7d1387f7f072",
"name": "Зуб",
"surname": "Зубов",
"lastname": "Зубович",
"phone": "78622000017",
"email": "",
"created_at": "2022-11-26 15:40:05",
"updated_at": "2022-11-26 15:40:05",
}
}
}
а если, дублирую номер телефона, то получаю 400-ю ошибку и пустой
respBuffer
Postman также дает 400-ю ошибку (выделил красным) но есть и описание ответа (а у меня нет):
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 16:48
Игорь Столяров
SergioRaguzini писал(а): 26 Ноябрь 2022, 16:34
Postman также дает 400-ю ошибку
Нужно смотреть заголовок запроса. Возможно Ваш Postman включает какой-то особый режим обмена.
Например вот здесь такое описано для POST:
https://testengineer.ru/curl-uchimsya-t ... o446865857
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 16:54
SergioRaguzini
Игорь Столяров писал(а): 26 Ноябрь 2022, 16:48
Нужно смотреть заголовок запроса. Возможно Ваш Postman включает какой-то особый режим обмена
Да, возможно у него обмен идет по иному... В принципе, все отрабатывается, но увидел разницу и подумал, что что-то делаю не так.
Спасибо за отклик!
LibCurl: Отладка запроса
Добавлено: 26 Ноябрь 2022, 18:04
Дед Пахом
В DebugView не видно этого ответа сервера?
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 10:15
SergioRaguzini
Дед Пахом писал(а): 26 Ноябрь 2022, 18:04
В DebugView не видно этого ответа сервера?
Привет Всем!
Не видно

:
Видит только Postman и cURL.exe
Как подметил ранее Игорь:
Игорь Столяров писал(а): 26 Ноябрь 2022, 16:48
...Postman включает какой-то особый режим обмена...
Видимо так и есть, а равенство ответов между DebugView и Libcurl подчеркивают правильность её (Libcurl) работы.
На самом деле, в этой ситуации, проблем никаких нет, все равно есть ответ-ошибка и соотв. вывод о невозможности выполнить операцию.
Я думал, что при использовании Libcurl, я где-то допустил ошибку когда увидел отличия, оказалось, все Ok
Спасибо Всем откликнувшимся!
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 12:37
Дед Пахом
SergioRaguzini писал(а): 27 Ноябрь 2022, 10:15
Видит только Postman и cURL.exe
curl.exe это та же самая libcurl.dll вид сбоку. Если Вы предъявите curl-скрипт, который возвращает ошибку в json, то можно разобраться, что у Вас не так в программе.
Я думаю, где-то Content-Type выставлен неверно. На картинке из Postman у Вас видно "Headers (9)", повторите их все для libcurl.
UPD: нет, скорее "Accept: application/json" не хватает, поэтому и не возвращается json.
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 15:38
SergioRaguzini
Дед Пахом писал(а): 27 Ноябрь 2022, 12:37
из Postman у Вас видно "Headers (9)"
Да ничего такого там вроде нет....
Дед Пахом писал(а): 27 Ноябрь 2022, 12:37
"Accept: application/json" не хватает, поэтому и не возвращается json
Глянул, у себя, но есть:
SELF.curl.AddHttpHeader('Accept: application/json'),
когда все без ошибок json приходит корректный, я этот момент обработаю по коду ошибки.
Спасибо
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 15:55
Дед Пахом
Вижу разницу: на скриншоте DebugView видно, что Content-Type: application/x-www-form-urlencoded. Postman посылает Content-Type: application/json, возможно в этом причина.
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 16:04
SergioRaguzini
Прошу помощи, ситуация следующая - в техподдержке сайта дали пример на cURL, в котором требуемые данные представлены с разделителями, вот этот кусок примера:
{\"provider_id\":\"6a742607-0329-4112-b2ff-3929221638b7\",\"phone\":\"78621234567\",\"text\":\"\/person_save_Имя:Иван\n\/person_save_Время:12:40\n\/set_tag:reminder\"}
Код: Выделить всё
curl.exe -X POST https:....." -d "{\"provider_id\":\"6a742607-0329-4112-b2ff-3929221638b7\",\"phone\":\"78621234567\",\"text\":\"\/person_save_Имя:Иван\n\/person_save_Время:12:40\n\/set_tag:reminder\"}" -o response.json
Если бы этих разделитей не было, то все решается через структуру:
Код: Выделить всё
DNT:Message GROUP
phone STRING(11) , NAME('phone')
text STRING(2001), NAME('text')
provider_id STRING(36) , NAME('provider_id')
END !
чего в моих прежних случаях (или GROUP или Queue) было достаточно и потом бы выполнил
json.ToJSON(DNT:Message)
Этот способ работает для обычного варианта, когда надо передать, например:
Код: Выделить всё
{"provider_id":"6a742607-0329-4112-b2ff-3929221638b7","phone":"78621234567","text":"Привет мир!"}
А как быть когда:
{\"provider_id\":\"6a742607-0329-4112-b2ff-3929221638b7\",\"phone\":\"78621234567\",\"text\":\"\/person_save_Имя:Иван\n\/person_save_Время:12:40\n\/set_tag:reminder\"}
как передать такое, например в RequestValue чтобы потом использовать здесь:
SELF.res = SELF.curl.SendRequestStr(CLIP(SELF.url) & 'messages/', RequestValue, respBuffer)
Спасибо
p.s. почитал в соседних постах про CreateObject не знаю в тему ли...

LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 16:14
Игорь Столяров
SergioRaguzini писал(а): 27 Ноябрь 2022, 16:04
про CreateObject не знаю в тему ли
И живые будут завидовать мёртвым ... (С) Остров сокровищ
В штатном классе JSON тоже есть флаг _UseEscapeString и метод EscapeString() для экранирования.
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 16:41
SergioRaguzini
Игорь Столяров писал(а): 27 Ноябрь 2022, 16:14
В штатном классе JSON тоже есть флаг _UseEscapeString и метод EscapeString() для экранирования.
Спасибо
text_ = '\"provider_id\":\"6a742607-0329-4112-b2ff-3929221638b7\",\"phone\":\"7862012345678\",\"text\":\"\/person_save_Имя:Иван\n\/person_save_Время:12:40\n\/set_tag:reminder\"'
RequestValue = JSON.EscapeString(CLIP(text_))
ConvertCharSet(RequestValue, 1251, 65001)
SELF.res = SELF.curl.SendRequestStr(CLIP(SELF.url) & 'messages/', RequestValue, respBuffer)
не уходит запрос хотя RequestValue тепрь уже содержит экранирование
Что делаю не так?
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 18:41
Дед Пахом
В Clarion кавычка это просто кавычка ", а не \".
LibCurl: Отладка запроса
Добавлено: 27 Ноябрь 2022, 19:55
SergioRaguzini
Дед Пахом писал(а): 27 Ноябрь 2022, 18:41
В Clarion кавычка это просто кавычка ", а не \".
Спасибо!
Теперь все заработало и с использованием, как обычно, GROUP
но если заполняю "text" простым значением, например "Привет", то все Ok
но, во втором, более сложном случае, надо передать в содержимом ключа "text" значение так, как они приводят это в примере из curl:
"\/person_save_Имя:Иван\n\/person_save_Время:15:40\n\/set_tag:reminder\"
как должно выглядеть значение ключа "text" в cla-программе чтобы ее понял сервер так как это он понимает если отправка идет через Curl?