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

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение 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?

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

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

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

Как я понимаю, это иное.
SELF.res <> CURLE_OK - результат выполнение запроса. Нет подключения к интернет, сервис не доступен и т.д..

400 BadRequest - ошибка в заголовке ответа, который вернул сервис (нет доступа, ошибка данных в запросе и т.д.)
Тогда в тушке ответа действительно могут быть какие-то поясняющие данные.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение 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-ю ошибку (выделил красным) но есть и описание ответа (а у меня нет):
postman1.png
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

SergioRaguzini писал(а): 26 Ноябрь 2022, 16:34 Postman также дает 400-ю ошибку
Нужно смотреть заголовок запроса. Возможно Ваш Postman включает какой-то особый режим обмена.
Например вот здесь такое описано для POST: https://testengineer.ru/curl-uchimsya-t ... o446865857
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение SergioRaguzini »

Игорь Столяров писал(а): 26 Ноябрь 2022, 16:48 Нужно смотреть заголовок запроса. Возможно Ваш Postman включает какой-то особый режим обмена
Да, возможно у него обмен идет по иному... В принципе, все отрабатывается, но увидел разницу и подумал, что что-то делаю не так.
Спасибо за отклик!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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

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

Сообщение SergioRaguzini »

Дед Пахом писал(а): 26 Ноябрь 2022, 18:04 В DebugView не видно этого ответа сервера?
Привет Всем!
Не видно :) :
dv1.png
Видит только Postman и cURL.exe
postman1.png
Как подметил ранее Игорь:
Игорь Столяров писал(а): 26 Ноябрь 2022, 16:48 ...Postman включает какой-то особый режим обмена...
Видимо так и есть, а равенство ответов между DebugView и Libcurl подчеркивают правильность её (Libcurl) работы.
На самом деле, в этой ситуации, проблем никаких нет, все равно есть ответ-ошибка и соотв. вывод о невозможности выполнить операцию.
Я думал, что при использовании Libcurl, я где-то допустил ошибку когда увидел отличия, оказалось, все Ok
Спасибо Всем откликнувшимся!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

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.
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение SergioRaguzini »

Дед Пахом писал(а): 27 Ноябрь 2022, 12:37 из Postman у Вас видно "Headers (9)"
Да ничего такого там вроде нет....
postman2.png
Дед Пахом писал(а): 27 Ноябрь 2022, 12:37 "Accept: application/json" не хватает, поэтому и не возвращается json
Глянул, у себя, но есть: SELF.curl.AddHttpHeader('Accept: application/json'),
когда все без ошибок json приходит корректный, я этот момент обработаю по коду ошибки.
Спасибо
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

Вижу разницу: на скриншоте DebugView видно, что Content-Type: application/x-www-form-urlencoded. Postman посылает Content-Type: application/json, возможно в этом причина.
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

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

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

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

SergioRaguzini писал(а): 27 Ноябрь 2022, 16:04 про CreateObject не знаю в тему ли
И живые будут завидовать мёртвым ... (С) Остров сокровищ :idied:

В штатном классе JSON тоже есть флаг _UseEscapeString и метод EscapeString() для экранирования.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение 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 тепрь уже содержит экранирование

Что делаю не так?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

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

В Clarion кавычка это просто кавычка ", а не \".
С уважением, ДП
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 233
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

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

Сообщение 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?
Ответить