Страница 1 из 2

POST и GET запросы

Добавлено: 05 Март 2014, 17:35
George
Clarion 8 ABC
Помогите пож-та. Совсем не знаком с данной темой:
передача файла с использованием POST запроса с определенным content-type и передачей файла в теле запроса.
А также GET запрос. Где копать, с чего начать ???

Re: POST и GET запросы

Добавлено: 06 Март 2014, 7:39
morkovin
NetTalk от CapeSoft

Re: POST и GET запросы

Добавлено: 06 Март 2014, 8:00
George
morkovin писал(а):NetTalk от CapeSoft
А где взять, чтобы попробовать ?

Re: POST и GET запросы

Добавлено: 06 Март 2014, 9:59
Yufil
Недавно, 22 февраля обсуждали похожую проблему.
http://forum.clarionlife.net/phpbb/view ... ead#unread

Возможно, если особых требований нет, класс CHTTP вполне самодостаточен.

Re: POST и GET запросы

Добавлено: 06 Март 2014, 10:43
George
Yufil писал(а):Недавно, 22 февраля обсуждали похожую проблему.
http://forum.clarionlife.net/phpbb/view ... ead#unread

Возможно, если особых требований нет, класс CHTTP вполне самодостаточен.
А где взять класс CHTTP ?

Re: POST и GET запросы

Добавлено: 06 Март 2014, 12:58
Yufil
Там же сказано - написать письмо...
Выгрузил свой каталог с классами и примером на http://files.mail.ru/717378EC938A4F33BE91E4E76FDB7002

Re: POST и GET запросы

Добавлено: 06 Март 2014, 22:52
George
Спасибо !

Re: POST и GET запросы

Добавлено: 06 Март 2014, 23:02
George
А описания использования класса нет ?

Re: POST и GET запросы

Добавлено: 07 Март 2014, 0:21
Yufil
Примерно так:
1 В секцию данных положить include('Chttp.inc')
2 Там, где нужен обмен с сервером, декларируем объект класса

! Если устраивают стандартные сообщения об ошибках ! Или, если надо самому выводить

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

H         CLASS(CHTTP)                          !Класс CHTTP
Throw     Procedure(String Str,Long Level),Long,Proc,Virtual
          End
! И, в локальных процедурах помещаем код 
H.Throw     Procedure(String Str,Long Level)
            ! Str - текст сообщения об ошибке 
            ! Level - уровень ошибки. Если Level=0-просто информация
            Code
            ! Куда-то выводим информацию об ошибке... 
            .... 
            Return(Level)
3. У нас есть (откуда-то снаружи) имя сервера, номер порта и имя файла.
Например, мы хотим скачать index.html с mail.ru, тогда сервер - mail.ru, а файл - index.html

А вот если я текущую страницу хочу загрузить, я в качестве сервера укажу forum.clarionlife.net,
а в качестве файла - phpbb/posting.php?mode=reply&f=1&t=3180&sid=9bcfc9b5b72d5ce3a133ad1e7504809f
Оставим за кадром отрезание http:// от адреса, выделение порта из имени сервера...

4. Соединяемся с сервером

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

                 If H.Connect(HTTPServer,Glo:HTTPPort)<>0
                   Message('Ошибка:' &  H.Error) 
                   H.Disconnect()
                   Return.... 
                 End
5. Загружаем файл

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

                 If H.GetData(Адресфайла, КудаПоложитьФайлНаДиск)  ! H.GetData('index.html','c:\index.html') 
                    Message('Ошибка:' & H.Error) 
                    H.Disconnect()
                    Return. 
                 End
Можно имя файла и не указывать, тогда скачанные данные лежат в переменной H.Response
6. Если нужно что-то отправить по протоколу Post, надо подготовить список Post-переменных и указать их значения
Для этого информируем класс о переменных

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

H.AddData('Var1','Значение Post-переменной Var1')
H.AddData('Var2','Значение Post-переменной Var2')
..... 

И отправляем, как и раньше 
                 If H.POSTData(Ссылка) 
                    Message('Ошибка:' & H.Error) 
                    H.Disconnect()
                    Return ... 
                 End

И, как и ранее, ответ лежит в H.Response 
В каталоге есть убогий примерчик ftptest, где можно немного поиграться...

Re: POST и GET запросы

Добавлено: 10 Март 2014, 13:09
George
Просьба к Yufil - помогите разобраться !
Нужно отправлять следующие запросы:
1.запрос на проверку:
https://mkassa.byro.ru/payment2/?CmdID= ... =102412582
2.получение ответа о проверке:
https://mkassa.byro.ru/payment2/?CmdID= ... =102412582

Делаю следующее:
!---------------------------------------------------------------------------
ConnectHTTP ROUTINE
DO Createfile
HTTPServer = 'mkassa.byro.ru'
HTTPPort = 80
IF H.Connect(HTTPServer,HTTPPort) = 0
DO PostHTTP
ELSE
MESSAGE('0) Ошибка: ' & H.Error,'Внимание !!!',ICON:Exclamation)
END
H.Disconnect()
!---------------------------------------------------------------------------
PostHTTP ROUTINE
IF H.PostData('payment2/?CmdID=NEW_COMMAND&FNAME=' & CLIP(Stringpath1),'POST\' & CLIP(Stringpath1)) = 0
!DO GetHTTP
ELSE
MESSAGE('1) Ошибка: ' & H.Error,'Внимание !!!',ICON:Exclamation)
END
!---------------------------------------------------------------------------

Однако после PostData выдает ошибку "Ошибка считывания данных".
В чем может быть проблема ?

Re: POST и GET запросы

Добавлено: 10 Март 2014, 22:05
Yufil
'payment2/?CmdID=NEW_COMMAND&FNAME=' & CLIP(Stringpath1),'POST\' & CLIP(Stringpath1))

Здесь точно слэш перед вопросительным знаком? Я не вижу имени скрипта. Что-то должно быть такое
payment2/edit.php?cmdID=...
payment2/edit.asp?cmdID=...

payment2.cgi?cmdID=...
payment2.php?cmdID=...

На крайний случай payment2?cmdID=...

Re: POST и GET запросы

Добавлено: 10 Март 2014, 22:29
George
Yufil писал(а):'payment2/?CmdID=NEW_COMMAND&FNAME=' & CLIP(Stringpath1),'POST\' & CLIP(Stringpath1))

Здесь точно слэш перед вопросительным знаком? Я не вижу имени скрипта. Что-то должно быть такое
payment2/edit.php?cmdID=...
payment2/edit.asp?cmdID=...

payment2.cgi?cmdID=...
payment2.php?cmdID=...

На крайний случай payment2?cmdID=...
В описании протокола приведен пример:

Примеры команд для проведения одного платежа:
1. запрос на проверку (в файле F2=1):
https://{URL}/?CmdID=NEW_COMMAND&FName=102412582
2. получение ответа о проверке:
https://{URL}/?CmdID=GET_ANSWER&FName=102412582

а в качестве URL - страница принимающая данные https://mkassa.byro.ru/payment2/

Re: POST и GET запросы

Добавлено: 11 Март 2014, 1:02
Yufil
Мне не посчастливилось работать с https. А в форуме на googlegroups было письмо от I.Astapov velais@imec.msu.ru, который сделал модифицированный модуль.

Вот его сообщение

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

Копать нужно с учетом трех моментов
1.	Порт 443 и HTTPS вместо HTTP.
2.	Добавить флаги обработки сертификатов
3.	Обрабатывать ошибку 12045 (в коде некрасивый go to на нужное место), это для
просроченных, не зарегистрированных как надо сертификатов.

Рабочий код, эти 3 момента выделены звездочками:
   i#=0;
   hInternetSession = InternetOpen(cAgent, INTERNET_OPEN_TYPE_PRECONFIG, i#, i#, 0)
***
   cService = 'HTTPS'
   hConnect = InternetConnect(hInternetSession, cServer, 443, 0, 0,
INTERNET_SERVICE_HTTP, 0, 1)
   IF hConnect
       hRequest = HttpOpenRequest( hConnect, cPost, cURLString, 0, 0, 0,

INTERNET_FLAG_SECURE+INTERNET_FLAG_KEEP_CONNECTION+INTERNET_FLAG_IGNORE_CERT_DATE_INVALID+INTERNET_FLAG_IGNORE_CERT_CN_INVALID,
1)
***
       IF hRequest
magain     IF HttpSendRequest(hRequest,0,0, address(my:request), jj#)
               RetValue = InternetReadFile(hRequest, ADDRESS(cBuffer), BufferLen,
dwBytesRead)
               cresponse=sub(cbuffer,1,dwBytesRead)
               RetValue  = TRUE
               ReadCount=dwbytesread
               LOOP
                   RetValue = InternetReadFile(hRequest, ADDRESS(cBuffer), BufferLen,
dwBytesRead)
                   IF RetValue
                       ReadCount += dwBytesRead
                       if dwbytesread; cresponse=cresponse&sub(cbuffer,1,dwbytesread); .
                       IF MaxLen AND ReadCount > MaxLen
                           RetValue = FALSE
                           self.response='Слишком большие данные';
                           BREAK
                       .
                   .
               WHILE RetValue AND dwBytesRead = BufferLen
               if RetValue
                    self.response=cresponse               .
           ELSE
***
               ii#=GetLasterror()
               if ii#=12045
                   dwBuffLen = size(dwFlags);
                   kk#=address(dwflags)
                   x#=InternetQueryOption
(hrequest,INTERNET_OPTION_SECURITY_FLAGS,kk#,dwbufflen)
                   dwFlags = bor(dwFlags,SECURITY_FLAG_IGNORE_UNKNOWN_CA)
                   InternetSetOption
(hrequest,INTERNET_OPTION_SECURITY_FLAGS,address(dwflags),size(dwflags))
                   goto magain
               else
                   stop ('error='&ii#)
               .
***
           .
           i#=InternetCloseHandle(hRequest)
       ELSE
           MESSAGE('Can''t open request to server [' & cServer & '], URL [' & cURLString
& ']', 'URL2File', ICON:Exclamation)
       .
       i#=InternetCloseHandle(hConnect)
   ELSE
       MESSAGE('Can''t connect to server [' & cServer & ']', 'URL2File', ICON:Exclamation)
   .
   i#=InternetCloseHandle(hInternetSession)
   dispose(cBuffer)


Re: POST и GET запросы

Добавлено: 14 Март 2014, 13:09
George
А куда вставлять "Рабочий код, эти 3 момента выделены звездочками:" ???

Re: POST и GET запросы

Добавлено: 29 Март 2014, 17:31
George
Кто-нибудь работал с библиотекой LIBCURL из CLARIONa ? Не поделитесь примером ?