Здравствуйте!
Нужно организовать HTTP запросы. Возникли вопросы, просьба подсказать знающим.
1. ReceiveNetworkData не получает одной командой всю информацию с сайта. Я сделал цикл с проверкой в ответах на закрывающий документ тег </HTML>. Это работает, но ведь это костыль? Какое тут верное решение должно быть? Можно было бы парсить заголовок в ответе, но он далеко не всегда содержит количество передаваемых данных.
2. Как работать с сайтом на HTTPS?
3. Как принимать UTF-8? В примере кода ниже как раз сайт на такой кодировке. Вместо кириллицы кракозябры.
Procedure$ net_connection (server_name$, method$, webpage$, post$) ; server_name$- домен сайта ; method$ - GET или POST ; webpage$ - имя страницы включая полный путь от домена ; post$ - какие данные отправить странице ConnectionID = OpenNetworkConnection(server_name$, 80) If ConnectionID ; соединение произошло request$ = method$+" " + webpage$ + " HTTP/1.1" + Chr(13) + Chr(10) request$ + "Host: " + server_name$ + Chr(13) + Chr(10) request$ + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204" + Chr(13) + Chr(10) request$ + "Accept: text/xml,application/xml,application/xhtml+xml," request$ + "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png," request$ + "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1" + Chr(13) + Chr(10) request$ + "Accept-Language: en-us, en;q=0.50" + Chr(13) + Chr(10) ; request$ + "Accept-Encoding: gzip, deflate, compress;q=0.9" + Chr(13) + Chr(10) request$ + "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66" + Chr(13) + Chr(10) request$ + "Keep-Alive: 300" + Chr(13) + Chr(10) request$ + "Connection: keep-alive" + Chr(13) + Chr(10) request$ + "Referer: " + referer$ + Chr(13) + Chr(10) request$ + "Cache-Control: max-age=0" + Chr(13) + Chr(10) request$ + "Content-Type: application/x-www-form-urlencoded" + Chr(13) + Chr(10) request$ + "Content-Length: " + Str(Len(post$)) + Chr(13) + Chr(10) request$ + Chr(13) + Chr(10) request$ + post$ res_send = SendNetworkData(ConnectionID,@request$,Len(request$)) ;Debug "res_send: "+Str(res_send) ret$="" done.a=0 bytes_rec=0 page_len=20000 timeout=1000 *mem_buf=AllocateMemory (page_len) If Not *mem_buf ProcedureReturn "ERROR: memory is not available" EndIf Repeat Delay(10) Result = NetworkClientEvent(ConnectionID) Select Result Case #PB_NetworkEvent_Data bytes_rec_a=ReceiveNetworkData(ConnectionID, *mem_buf+bytes_rec, page_len) bytes_rec+bytes_rec_a Debug bytes_rec_a If FindString(PeekS (*mem_buf), "</html>", 1) Or FindString(PeekS (*mem_buf), "</HTML>", 1) done=1 ElseIf (MemorySize (*mem_buf)-bytes_rec)<page_len *mem_buf=ReAllocateMemory (*mem_buf, MemorySize (*mem_buf)+page_len) EndIf Case 0 timeout-1 If timeout=0 ret$="ERROR: timeout"+Chr(13) Break EndIf EndSelect Until done = 1 CloseNetworkConnection(ConnectionID) ret$+PeekS (*mem_buf) FreeMemory (*mem_buf) Debug "bytes_rec: "+Str(bytes_rec) ProcedureReturn ret$ Else; соединение не произошло ProcedureReturn "ERROR: no connection" EndIf EndProcedure InitNetwork() Enumeration #win_0 #gad_edit_0 EndEnumeration win_id=OpenWindow(#win_0, 0, 0, 600, 600, "NET", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_ScreenCentered) gad_edit_0_id = EditorGadget(#gad_edit_0, 5, 5, 590, 590) page_content$=net_connection ("ulyanovskstiralmash.plp7.ru", "GET", "/", "") SetGadgetText (#gad_edit_0, GetGadgetText(#gad_edit_0)+page_content$) AddGadgetItem(#gad_edit_0, -1, "___________________"+#CRLF$+"Total: "+Str(Len(page_content$))+" characters") SendMessage_(GadgetID(#gad_edit_0),#EM_SETSEL,-1,-1) Repeat Until WaitWindowEvent() = #PB_Event_CloseWindow End