Страница: 1 |
Страница: 1 |
Вопрос: Запрос методом POST
Добавлено: 24.03.06 12:54
Автор вопроса: vasjos
Не подскажет ли кто нибуть как это делается? Есть форма с логином и паролем которую надо отослать и в ответ получить содержимое веб-страницы. Через ВебБроузер работает, но он много лишнего загружает, хотелось бы как нибуть через АПИ.
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 24.03.06 18:34
сокеты читаем...
socket, bind, connect, send, recv, closesocket если не страшно поддтормаживание приложения то синхронные, если не желательно - асинхронные...
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 24.03.06 18:35
ЗЫ
как вариант WinSock Control
Номер ответа: 3
Автор ответа:
vasjos
Вопросов: 3
Ответов: 6
Профиль | | #3
Добавлено: 24.03.06 19:10
Есть примеры какие нибуть, а то страшновато
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 24.03.06 21:10
на dasharm.com есть контрол - вбсокет, с хелпами, примерами итп... для общего развития читаем http протокол и ищим примеры... можно винсоковские, там всё аналоично
Номер ответа: 5
Автор ответа:
vasjos
Вопросов: 3
Ответов: 6
Профиль | | #5
Добавлено: 05.04.06 19:06
Попробовал через АПИ, примерно так
Public Function URLPostStr(sURL As String, sData As String, Optional sRefer As String = vbNullString) As String
Dim hInternet As Long
Dim hConnect As Long
Dim hRequest As Long
Dim bSend As Integer
Dim sReadBuffer As String * 2048
Dim bDoLoop As Boolean
Dim bRead As Boolean
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
Dim head As String
hInternet = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
If hInternet <> 0 Then
hConnect = InternetConnect(hInternet, Left$(sURL, InStr(sURL, "/" - 1), INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
If hConnect <> 0 Then
hRequest = HttpOpenRequest(hConnect, "POST", Right(sURL, Len(sURL) - InStr(sURL, "/" + 1), "HTTP/1.1", sRefer, 0, INTERNET_FLAG_RELOAD, 0)
If hRequest <> 0 Then
'bSend = HttpSendRequest(hRequest, vbNullString, 0, sData, Len(sData))
head = "Content-Type: application/x-www-form-urlencoded" ' & vbCrLf & "Accept-Language: en" & vbCrLf & "Accept-Encoding: gzip, deflate"
bSend = HttpSendRequest(hRequest, head, Len(head), sData, Len(sData))
If bSend Then
bDoLoop = True
While bDoLoop
sReadBuffer = vbNullString
bRead = InternetReadFile(hRequest, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
DoEvents
Wend
End If
InternetCloseHandle (hRequest) 'çàêðûâàåì çàïðîñ
End If
InternetCloseHandle (hConnect)
End If
InternetCloseHandle (hInternet)
End If
URLPostStr = sBuffer
End Function
но что-то не так, сервер не видит параметры переданые в sData. Может сталкивался кто нибуть с этим?
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 06.04.06 18:59
см пост № 4
+
Private Sub T1_DataArrival(Data As String)
If ResivingLen = 0 And Trim$(Data) <> "" Then
'Получаем размер закачиваемых данных
Dim S As Long, e As Long
S = InStr(1, Data, "Content-Length:", 1)
S = S + Len("Content-Length:"
e = InStr(S, Data, vbCrLf, 1)
ResivingLen = VBA.Val(VBA.Trim$(VBA.Mid$(Data, S, e)))
'Если не получили, считаем что это все что есть...
If ResivingLen = 0 Then ResivingLen = Len(Data)
End If
'Сигнализатор прихода данных
Shape1.Visible = True 'Магающая лампочка (В таймере делается False)
T1.Tag = T1.Tag & Data
End Sub
'Ф-ция закачки файла через VBSocet (by DaSharm)
Public Function DownloadFileToVar(strFile As String, Optional lPort As Long = 80) As String
Dim Reqest As String, strHost As String
Dim S As Long
Dim timeout As Integer
'Получаем имя хоста из адреса
S = VBA.InStr(1, strFile, "://", 1) + 3
timeout = VBA.InStrB(S, strFile, "/", 1) - 1
If S = 3 Then S = 1: If timeout = 0 Then timeout = Len(strFile)
strHost = VBA.Mid$(strFile, S, timeout)
'Обнуляем рабочие переменные
timeout = 0: S = 0: T1.Tag = "": ResivingLen = 0
T1.AlertMode = Yes 'Показывать ошибки
T1.Connect strHost, lPort 'Подключаемся
Do While T1.State = Connecting
DoEvents
Call Sleep(100&
timeout = timeout + 1
If timeout > 200 Then '20 cек
MsgBox "Нет ответа от " & strHost, vbCritical, "Timeout"
 ownloadFileToVar = ""
Exit Function
End If
Loop 'Ждём подключения
'Формируем http запрос
Reqest$ = "GET " & strFile & " HTTP/1.1" & vbCrLf & _
"Host: " & strHost & vbCrLf & _
"Referer: " & strHost & vbCrLf & _
"Proxy-Connection: Keep-Alive" & vbCrLf & _
"Content-Type: application/x-www-form-urlencoded" & vbCrLf & _
"Pragma: no-cache" & vbCrLf & vbCrLf
T1.SendData Reqest$ 'Отправляем его
timeout = 0 'Счётчик таймаута сбрасуем
'Ждём пока полученные данные будут больше чем размер который вернул нам сервер ResivingLen
'это будет означать что все данные скачаны, ну или почти все т.к. там ещё + заголовок пакета
Do Until Len(T1.Tag) >= ResivingLen And ResivingLen > 0
DoEvents
Call Sleep(100&
timeout = timeout + 1
If timeout > 200 Then '20 cек
MsgBox "Нет ответа от " & strHost, vbCritical, "Timeout"
 ownloadFileToVar = ""
Exit Function
End If
Loop
Call Sleep(1000& 'Цуть-цуть ждём, чтобы точно все загрузились
DoEvents
T1.CloseConnection
S = InStr(1, T1.Tag, vbCrLf & vbCrLf, 1) + 4 'Определяем конец заголовка
 ownloadFileToVar = VBA.Mid$(T1.Tag, S, ResivingLen) 'И отрезаем
T1.Tag = ""
ResivingLen = 0
End Function
Номер ответа: 7
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #7
Добавлено: 06.04.06 23:11
У меня есть контрол ... Я его ещё не выкладывал.... Он для работы с НТТР, на базе VBSocket....
Можно отправлять запросы методами ГЕТ и ПОСТ. Поддерживает 2 кодирования для ПОСТ. Поддерживает авторизацию (ну когда страничка или прокси-сервер под паролем, которую запрашиваете). Показывает прогресс загрузки в байтах. Ловит ХТТП ошибки, показывает редиректы (ну если страница запрашиваемая отредиректила). Ну и просто вроде нормально работает...На больших файлах не проверял, правда...И НЕ поддерживает ПОКА докачки файлов...
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 07.04.06 00:56
Интересно...
как сделать что-то вроде Seek только на удалённом файле Ждёмс контрола...
Номер ответа: 9
Автор ответа:
vasjos
Вопросов: 3
Ответов: 6
Профиль | | #9
Добавлено: 07.04.06 16:01
Уважаемый HACKER, с GET у меня и так нет проблем, мне не получается правильно передать на сервер POST параметры. В вашем примере реализован GET запрос, а не POST
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 07.04.06 16:58
Если считаешь что мой код не в тему, я даже готов извиниться... но ты зря так считаешь, подумай почему...
Номер ответа: 11
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #11
Добавлено: 07.04.06 17:39
Добавил на сайт компонент.
http://dasharm.com/modules.php?name=Files&d_op=get_file_details&files_id=16
Номер ответа: 12
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #12
Добавлено: 07.04.06 17:44
'Ф-ция закачки файла через VBSocet (by DaSharm)
Public Function DownloadFileToVar(strFile As String
кстати, у тебя ошибочка..на сервак надо передавать относительный путь..типа:
lalala.com/new/text.htm
запрос должен быть:
GET /new/text.htm HTTP 1.0
.....
Host: lalala.com
Делая запрос
GET lalala.com/new/text.htm HTTP 1.0
ты очень рискуешь. На практике 20% серверов не поддерживают такой вид запроса.
Номер ответа: 13
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #13
Добавлено: 07.04.06 18:06
т.е.
http://lalala.com/new/text.htm
может не работать?
З.Ы. Тестил на своём хостинге и на hut.ru - работает
Номер ответа: 14
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #14
Добавлено: 07.04.06 18:07
В 20% не работает...
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 07.04.06 18:49
ок, спасиб, поправлю...