POST и GET запросы

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

POST и GET запросы

Сообщение George »

Clarion 8 ABC
Помогите пож-та. Совсем не знаком с данной темой:
передача файла с использованием POST запроса с определенным content-type и передачей файла в теле запроса.
А также GET запрос. Где копать, с чего начать ???
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

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

Сообщение morkovin »

NetTalk от CapeSoft
WBR, morkovin
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

morkovin писал(а):NetTalk от CapeSoft
А где взять, чтобы попробовать ?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

Возможно, если особых требований нет, класс CHTTP вполне самодостаточен.
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

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

Возможно, если особых требований нет, класс CHTTP вполне самодостаточен.
А где взять класс CHTTP ?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

Там же сказано - написать письмо...
Выгрузил свой каталог с классами и примером на http://files.mail.ru/717378EC938A4F33BE91E4E76FDB7002
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

Спасибо !
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

А описания использования класса нет ?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение 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, где можно немного поиграться...
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение 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 выдает ошибку "Ошибка считывания данных".
В чем может быть проблема ?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение 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=...
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение 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/
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

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

George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

А куда вставлять "Рабочий код, эти 3 момента выделены звездочками:" ???
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

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

Сообщение George »

Кто-нибудь работал с библиотекой LIBCURL из CLARIONa ? Не поделитесь примером ?
Ответить