Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Запрос методом POST Добавлено: 24.03.06 12:54  

Автор вопроса:  vasjos
Не подскажет ли кто нибуть как это делается? Есть форма с логином и паролем которую надо отослать и в ответ получить содержимое веб-страницы. Через ВебБроузер работает, но он много лишнего загружает, хотелось бы как нибуть через АПИ.

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 24.03.06 18:34
сокеты читаем...

socket, bind, connect, send, recv, closesocket если не страшно поддтормаживание приложения то синхронные, если не желательно - асинхронные...

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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) '&#231;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#231;&#224;&#239;&#240;&#238;&#241;
        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"
            ;DownloadFileToVar = ""
            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"
            ;DownloadFileToVar = ""
            Exit Function
        End If
    Loop
    
    Call Sleep(1000&;) 'Цуть-цуть ждём, чтобы точно все загрузились :)
    DoEvents
    T1.CloseConnection
    S = InStr(1, T1.Tag, vbCrLf & vbCrLf, 1) + 4 'Определяем конец заголовка
    ;DownloadFileToVar = VBA.Mid$(T1.Tag, S, ResivingLen) 'И отрезаем :)
    T1.Tag = ""
    ResivingLen = 0
End Function

Ответить

Номер ответа: 7
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #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-сайт: dasharm.com
 Профиль | | #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-сайт: dasharm.com
 Профиль | | #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-сайт: dasharm.com
 Профиль | | #14
Добавлено: 07.04.06 18:07
В 20% не работает...

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 07.04.06 18:49
ок, спасиб, поправлю...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам