libcurl for Clarion

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

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

libcurl for Clarion

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

Игорь Столяров писал(а): 18 Август 2018, 16:51Всё выполняется, получаю ответ: Success, see file post_response.txt for details !
Т.е. всё хорошо, но файла post_response.txt - НЕТ. Совсем. Нигде.
А в лог dbgview что пишется?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

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

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

libcurl for Clarion

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

Игорь Столяров писал(а): 18 Август 2018, 18:38Подскажите пожалуйста где его искать (или как его включить) ?
DebugView https://docs.microsoft.com/en-us/sysint ... /debugview - скачать и запустить, весь вывод через API OutputDebugString() пойдёт в него. libcurl по умолчанию фигачит туда всё, полезно для отладки.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

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

Спасибо. Понял.
  • 00000001 0.00000000 [3612] [libcurl] TEXT: Trying 81.177.31.8...
    00000002 0.00008276 [3612] [libcurl] TEXT: TCP_NODELAY set
    00000003 0.01855378 [3612] [libcurl] TEXT: Connected to npchk.nalog.ru (81.177.31.8) port 80 (#0)
    00000004 0.01867409 [3612] [libcurl] HEADER_OUT: POST /FNSNDSCAWS_2?wsdl HTTP/1.1
    00000005 0.01867409 [3612] Host: npchk.nalog.ru
    00000006 0.01867409 [3612] Accept: */*
    00000007 0.01867409 [3612] Content-Length: 0
    00000008 0.01867409 [3612] Content-Type: application/x-www-form-urlencoded
    00000009 0.01867409 [3612]
    00000010 0.03757131 [3612] [libcurl] HEADER_IN: HTTP/1.1 415 Unsupported Media Type
    00000011 0.03760448 [3612] [libcurl] HEADER_IN: Server: nginx/1.10.3
    00000012 0.03765006 [3612] [libcurl] HEADER_IN: Date: Sat, 18 Aug 2018 17:26:19 GMT
    00000013 0.03767850 [3612] [libcurl] HEADER_IN: Content-Length: 0
    00000014 0.03770948 [3612] [libcurl] HEADER_IN: Connection: keep-alive
    00000015 0.03773974 [3612] [libcurl] TEXT: HTTP error before end of send, stop sending
    00000016 0.03779078 [3612] [libcurl] HEADER_IN:
    00000017 0.03784146 [3612] [libcurl] TEXT: Curl_http_done: called premature == 0
    00000018 0.03789214 [3612] [libcurl] TEXT: Closing connection 0
Как я понял, на 15 строке происходит прерывание передачи запроса, и возвращается пустой ответ сервиса ...

Но ! Если посмотреть оригинальный пример PostFile - то там такая же ошибка передачи запроса,
просто "http://www.clarionlife.net/curl/index.php" возвращает всегда один и тот же ответ,
назависимо от содержания файла с запросом и вообще при его отсутствии (пустой файл test.xml).

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

libcurl for Clarion

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

Всё-таки проблема есть и она - в LibCurl. :(

1. Выполняю из командной строки:

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

curl --header "Content-Type: text/xml;charset=UTF-8" --data @test.xml http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl -o resp.xml
получаю адекватный ответ сервиса (как и должно быть):

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

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<NdsResponse2 xmlns="http://ws.unisoft/FNSNDSCAWS2/Response" DTActFL="16.08.2018" DTActUL="16.08.2018"><NP INN="7812014560" KPP="770701001" DT="20.03.2018" State="0"/>
</NdsResponse2>
</S:Body>
</S:Envelope>
2. Выполняю POSTFILE с тем же test.xml в LibCurl, прописав заголовок (и вижу в DebugView, что он установлен) и получаю ответ:

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

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"><faultcode>S:Client</faultcode>
<faultstring>Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
 at [row,col {unknown-source}]: [1,0]
 </faultstring>
 </S:Fault>
 </S:Body>
 </S:Envelope>
Ну тут уже явное указание сервиса на проблему: неожиданное завершение файла с запросом ...
Посмотрите пожалуйста в чём беда ? :) Я дальше уже ничего не могу сделать ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

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

Игорь Столяров писал(а): 18 Август 2018, 20:34Не передаётся запрос из файла на сервис
То же и с http://www.clarionlife.net/curl/index.php - не передаётся файл в сервис (index.php), всё заканчивается на сервере, который выдаёт "HTTP/1.1 301 Moved Permanently" и возвращает html с этой ошибкой. Сервер nalog.ru не утруждает себя подобным дружелюбным поведением.
Ошибка "HTTP/1.1 415 Unsupported Media Type" хз что обозначает, может xml файл не такой? Сейчас посмотрел у них на сайте, там совсем другой xml предлагают использовать. Кстати, вот это "argname = 'userfile'" тоже вызывает сомнения -- может они ожидают другое имя.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

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

Игорь Столяров писал(а): 18 Август 2018, 21:28Выполняю из командной строки:
С этого и надо было начинать :-) Вам нужен совершенно другой код:

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

  curl.Init()
  
  url = 'http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl'   ! ЗАМЕНИЛ
  respfile = 'post_response.txt'
  
  curl.AddHttpHeader('Content-Type: text/xml;charset=UTF-8')
  curl.SetHttpHeaders()

  res = curl.SendRequest(url, '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://ws.unisoft/FNSNDSCAWS2/Request"> <soapenv:Header/> <soapenv:Body> <req:NdsRequest2> <!--1 to 10000 repetitions:--> <req:NP INN="7812014560" KPP="770701001" DT="18.08.2018"/> </req:NdsRequest2> </soapenv:Body> </soapenv:Envelope>', respfile)
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

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

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

libcurl for Clarion

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

В классе TCurlHttpClass есть метод SendFile, который делает именно то что надо:

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

  curl.Init()
  
  url = 'http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl'   ! ЗАМЕНИЛ
  infile = 'test.xml'
  respfile = 'post_response.txt'

  res = curl.SendFile(url, infile, 'text/xml;charset=UTF-8', respfile)

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

libcurl for Clarion

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

Вообще говоря, PostFile это имитация загрузки файла на сервер с веб-страницы: есть экранное поле с именем файла, есть кнопка Submit, по которой на сервер отправляются введённые пользователем данные. Content-Type в этом случае автоматически генерируется как "application/x-www-form-urlencoded".
SendFile - это запрос с postfields - содержимым файла.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

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

Если есть работающий скрипт curl.exe, а с libcurl не получается, запускайте "curl.exe ... ... --libcurl test.c", и в файле test.c смотрите, какие методы с какими параметрами надо вызывать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

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

Дед Пахом писал(а): 18 Август 2018, 22:44--libcurl test.c", и в файле test.c
Классно ! Спасибо. Потому, что примеров работающих скриптов в сети полно.
Эх, такую бы опцию, да сразу в исходники Clarion'а … ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libcurl for Clarion

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

Добрый день ! Созрел вопрос по существу сабжа. :)

Работаю с сервисом, который требует установку AGENT в запросе. Через WinInet - всё работает.
Пробую сделать запрос через CURL - получаю статус ответа, что некорректный запрос.
Их тех. поддержка говорит, что я не передаю в запросе AGENT .... :( Упс !

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

     Curl.Init()
     
     Curl.SetSSLVersion(CURL_SSLVERSION_DEFAULT)          
     Curl.SetSSLVerifyHost(false)
     Curl.SetSSLVerifyPeer(false)
     
     Curl.SetOpt(CURLOPT_USERAGENT,'MY_EMAIL')     ! < ---- ВОТ ЭТО НЕ ВИЖУ В DEBUGVIEW
     Curl.SetOpt(CURLSSH_AUTH_AGENT,'MY_EMAIL')   ! < ---- ВОТ ЭТО НЕ ВИЖУ В DEBUGVIEW
     
     Loc:xRes = curl.SendRequest( ...
Смотрю через DEBUGVIEW и нигде не вижу установки AGENT. Так и должно быть ?
Или как можно проконтролировать, что AGENT в запросе установлен ?
Заранее спасибо за содействие ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libcurl for Clarion

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

Игорь Столяров писал(а): 21 Август 2018, 7:56Curl.SetOpt(CURLOPT_USERAGENT,'MY_EMAIL')
Для строк в SetOpt надо передавать переменную, а не константу:

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

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

libcurl for Clarion

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

Дед Пахом писал(а): 21 Август 2018, 11:12Для строк в SetOpt надо передавать переменную
Спасибо ! Пошла вода в хату … :)
Это меня, пиашписты ввели в заблуждение, потому, что у них синтаксис:

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

   $ch = curl_init( $url );
   curl_setopt( $ch, CURLOPT_USERAGENT, "My User Agent" );
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто