Страница 17 из 30
					
				libcurl for Clarion
				Добавлено: 12 Ноябрь 2015, 20:11
				 Дед Пахом
				Вроде все основные функции закрыл:
- выгрузка файлов с сервера
- загрузка файлов на сервер
- HTTP GET/POST с возможностью прочитать ответ сервера
- Поддержка SSL
Тестировал на протоколах http, https, ftp, sftp, ftpes.
Краткий туториал в файле \doc\How-To.txt.
 
 
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 17:39
				 Дед Пахом
				Игорь Столяров писал(а): 18 Август 2018, 16:51Всё выполняется, получаю ответ: Success, see file post_response.txt for details !
Т.е. всё хорошо, но файла post_response.txt - НЕТ. Совсем. Нигде. 
 
А в лог dbgview что пишется?
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 18:38
				 Игорь Столяров
				Дед Пахом писал(а): 18 Август 2018, 17:39А в лог dbgview что пишется?
 
Подскажите пожалуйста где его искать (или как его включить) ?
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 19:56
				 Дед Пахом
				Игорь Столяров писал(а): 18 Август 2018, 18:38Подскажите пожалуйста где его искать (или как его включить) ?
 
DebugView 
https://docs.microsoft.com/en-us/sysint ... /debugview - скачать и запустить, весь вывод через API OutputDebugString() пойдёт в него. libcurl по умолчанию фигачит туда всё, полезно для отладки.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 20:34
				 Игорь Столяров
				Спасибо. Понял.
- 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.
 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).
Не передаётся запрос из файла на сервис … 

 А нет запроса, то и нет ответа.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 21:28
				 Игорь Столяров
				Всё-таки проблема есть и она - в 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>
Ну тут уже явное указание сервиса на проблему: неожиданное завершение файла с запросом ...
Посмотрите пожалуйста в чём беда ? 

 Я дальше уже ничего не могу сделать ...
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 21:32
				 Дед Пахом
				Игорь Столяров писал(а): 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'" тоже вызывает сомнения -- может они ожидают другое имя.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 21:45
				 Дед Пахом
				Игорь Столяров писал(а): 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)
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 22:08
				 Игорь Столяров
				Ура ! Заработало ! Спасибо. Так даже лучше, не надо создавать файл для SOAP запроса. 

Сейчас ещё ответ сразу загоню через строку в XML DOM и распарсю - вообще красота будет.
В общем-то, стало немного светлее ... 

 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 22:09
				 Дед Пахом
				В классе 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, код выше теперь работает.
 
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 22:41
				 Дед Пахом
				Вообще говоря, PostFile это имитация загрузки файла на сервер с веб-страницы: есть экранное поле с именем файла, есть кнопка Submit, по которой на сервер отправляются введённые пользователем данные. Content-Type в этом случае автоматически генерируется как "application/x-www-form-urlencoded".
SendFile - это запрос с postfields - содержимым файла.
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 22:44
				 Дед Пахом
				Если есть работающий скрипт curl.exe, а с libcurl не получается, запускайте "curl.exe ... ... --libcurl test.c", и в файле test.c смотрите, какие методы с какими параметрами надо вызывать.
			 
			
					
				libcurl for Clarion
				Добавлено: 18 Август 2018, 22:55
				 Игорь Столяров
				Дед Пахом писал(а): 18 Август 2018, 22:44--libcurl test.c", и в файле test.c
 
Классно ! Спасибо. Потому, что примеров работающих скриптов в сети полно.
Эх, такую бы опцию, да сразу в исходники Clarion'а … 

 
			 
			
					
				libcurl for Clarion
				Добавлено: 21 Август 2018, 7:56
				 Игорь Столяров
				Добрый день ! Созрел вопрос по существу сабжа. 
Работаю с сервисом, который требует установку 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 в запросе установлен ?
Заранее спасибо за содействие ... 

 
			 
			
					
				libcurl for Clarion
				Добавлено: 21 Август 2018, 11:12
				 Дед Пахом
				Игорь Столяров писал(а): 21 Август 2018, 7:56Curl.SetOpt(CURLOPT_USERAGENT,'MY_EMAIL') 
 
Для строк в SetOpt надо передавать переменную, а не константу:
Код: Выделить всё
szUserAgent                   CSTRING('curl/7.52.1')
  CODE
  SELF.SetOpt(CURLOPT_USERAGENT, szUserAgent)
 
			 
			
					
				libcurl for Clarion
				Добавлено: 21 Август 2018, 13:35
				 Игорь Столяров
				Дед Пахом писал(а): 21 Август 2018, 11:12Для строк в SetOpt надо передавать переменную
 
Спасибо ! Пошла вода в хату … 
 
Это меня, пиашписты ввели в заблуждение, потому, что у них синтаксис:
Код: Выделить всё
   $ch = curl_init( $url );
   curl_setopt( $ch, CURLOPT_USERAGENT, "My User Agent" );