Toon posts:

[VB] winsock & http

Pagina: 1
Acties:
  • 157 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Ik heb het volgende probleem. Ik wil een pagina opvragen en die in me eigen programma tonen (html-code).


Ik doe dit met de volgende code:

Private Sub wsock_Connect()

Dim str As String

str = "get / HTTP/1.1" & vbCrLf & vbCrLf
wsock.SendData str

End Sub


Maar ik krijg het volgende terug:

HTTP/1.1 400 Bad Request
Server: Microsoft-IIS/4.0
Date: Fri, 12 Jul 2002 05:26:21 GMT
Connection: close
Content-Length: 407
Content-Type: text/html

<html><head><title>Error 400</title>

<meta name="robots" content="noindex">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"></head>

<body>

<h2>HTTP Error 400</h2>

<p><strong>400 Bad Request</strong></p>

<p>Due to malformed syntax, the request could not be understood by the server. The client should not repeat the request without modifications.</p>

</body></html>


Weet iemand wat ik fout doe :? alvast bedankt.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 19:44

Gerco

Professional Newbie

Misschien moet je geen vbCrLf sturen, maar alleen een vbLf (als die bestaat, CHR$(10) iig)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

eeeuh . .wat dacht je van een geldige url ? :7

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op vrijdag 12 juli 2002 08:48 schreef Skizmo het volgende:
eeeuh . .wat dacht je van een geldige url ? :7
Is geldig
Op vrijdag 12 juli 2002 08:15 schreef Gerco het volgende:
Misschien moet je geen vbCrLf sturen, maar alleen een vbLf (als die bestaat, CHR$(10) iig)
\r\n is de standaard, vbCrLf is dus goed.

Echter wat fout is:
- GET moet volgens mij met hoofdletters.
- Als je HTTP/1.1 gebruikt _moet_ je een 'Host: servernaam' header meegeven.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 23:33

johnwoo

3S-GTE

Op vrijdag 12 juli 2002 08:51 schreef ACM het volgende:

[..]

Is geldig
[..]

\r\n is de standaard, vbCrLf is dus goed.

Echter wat fout is:
- GET moet volgens mij met hoofdletters.
- Als je HTTP/1.1 gebruikt _moet_ je een 'Host: servernaam' header meegeven.
Inderdaad. Daarnaast zou ik ook een 'Connection: close' header meegeven, anders heb je kans dat de server hem open laat in afwachting van volgende requests. Persoonlijk vind ik het in VB makkelijker om de content te gaan bekijken als de verbinding verbroken wordt, dan om precies te gaan zitten bepalen hoe lang het zou moeten zijn. Maar ik gebruik dan ook HTTP/1.0 voor dit soort simpele dingen; als je een volwaardige HTTP/1.1 implementatie wil maken zal je ook persistent connections en chunked data moeten gaan implementeren.

[edit]
Kijk hier voor een zeer goede basic HTTP uitleg.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • MrBrown
  • Registratie: Augustus 2000
  • Laatst online: 11-06 15:51

MrBrown

Reservoir Dog

Je implementeerd het protocol idd niet helemaal goedm 't zit 'm idd in die hoofdletters en die host. Een paginaatje welk ik wel handig vond:
HTTP Made Really Easy
En dan ff de http1.1 clients checken... :)

Powered by Manetti (compiled by Jura)


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 23:33

johnwoo

3S-GTE

Op vrijdag 12 juli 2002 09:37 schreef MrBrown het volgende:
Je implementeerd het protocol idd niet helemaal goedm 't zit 'm idd in die hoofdletters en die host. Een paginaatje welk ik wel handig vond:
HTTP Made Really Easy
En dan ff de http1.1 clients checken... :)
Grmbl.. die URL was ik net ff aan het opzoeken :P Naja, het moet dus wel een hele goede uitleg zijn :P

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Sodeju, hoe bedoel je het jezelf moeilijk maken! Zoek even op XMLHTTP. Is bedoeld voor dit soort dingen. Werkt ook in ASP / vbscript.

Even een voorbeeldje:

Function GetExternalPagina(method,url)
Response.Buffer = True
Dim objXMLHTTP, xml
Set xml = Server.CreateObject("Microsoft.XMLHTTP")
xml.Open method, url, False
xml.send
return xml.responseText
End Function
Method kan uiteraard post/get zijn


Suc6

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 23:33

johnwoo

3S-GTE

Op vrijdag 12 juli 2002 09:44 schreef Jeroenvw het volgende:
Sodeju, hoe bedoel je het jezelf moeilijk maken! Zoek even op XMLHTTP. Is bedoeld voor dit soort dingen. Werkt ook in ASP / vbscript.

Even een voorbeeldje:

[...]
Method kan uiteraard post/get zijn


Suc6
Ja, maar wat als hij zn programma wil draaien op Windows 95? Dan moet dat gebeuren eerst weer geinstalleerd worden. Het fijnst (voor de gebruiker) is nog altijd een programma met zo weinig mogeljik dependencies, en dat probeer ik dan ook meestal, ook al is het met VB soms wat lastig.

Er is ook een standaard sleur-en-pleur componentje voor de commondialog controls, terwijl je dat ook door je programma zelf met een API call kunt laten doen; komt een beetje op hetzelfde neer.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

code:
1
2
3
4
5
6
7
8
9
10
11
Public Sub GetPage(strPage As String)
    With sckRAC
      .SendData "GET /" & strPage & " HTTP/1.0" & vbCrLf
      .SendData "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*" & vbCrLf
      .SendData "Accept-Language: nl" & vbCrLf
      '.SendData "Accept-Encoding: gzip, deflate" & vbCrLf
      .SendData "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)" & vbCrLf
      .SendData "Host: " & sckRAC.RemoteHost & vbCrLf
      .SendData "Connection: Keep-Alive" & vbCrLf & vbCrLf
    End With
End Sub


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'Verbinden:
    With sckRAC
      .RemoteHost = "www.test.com"
      .RemotePort = "80"
      .Connect
    End With

    '//Wait until connected
    Do
      DoEvents
      If sckRAC.State = sckConnected Then Exit Do
    Loop

    '//Get page
     Call GetPage("vbasic/test.htm")

Bij DataArrival komt de data binnen

Erg belangrijk: Gebruik HTTP1.0, waarom? Nou HTTP1.1 kan betekenen dat je bijvoorbeeld dingen in kleinere delen krijgt, of zelfs gecomprimeerd met gzip. Daarom maar 1.0 :)

Have fun..

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 23:33

johnwoo

3S-GTE

Op vrijdag 12 juli 2002 10:13 schreef 41.6C.6D.61.72 het volgende:

[...]

Erg belangrijk: Gebruik HTTP1.0, waarom? Nou HTTP1.1 kan betekenen dat je bijvoorbeeld dingen in kleinere delen krijgt, of zelfs gecomprimeerd met gzip. Daarom maar 1.0 :)

Have fun..
Voor gecomprimeerde data hoef je niet bang te zijn; die krijg je alleen maar als jij met Accept-encoding aangeeft dat je programma het snapt. Maar chunked data kun je idd wel verwachten; zo'n beetje alle HTTP/1.1 servers sturen hun data standaard chunked, en omdat het geen optionele HTTP/1.1 feature maar een integraal onderdeel van het protocol is kun je niet aangeven dat je je data niet-chunked wil ontvangen...

Overigens valt dat nog best te bouwen hoor; bij chunked data krijg je, na de headers, gewoon telkens een blokje binnen dat begint met een regeltje waarin de lengte van het blokje staat, en eindigt met een blank line. Dit heeft verder niks te maken met de persistent connections (die kan je 'uitschakelen' met Connection: close), dus erg veel heeft het niet om het lijf.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Topicstarter
Bedankt allemaal, ik heb het zo werkend gekregen:
code:
1
2
3
4
5
6
7
8
Private Sub wsock_Connect()

Dim str As String

    str = "GET / HTTP/1.0" & vbCrLf & vbCrLf
    wsock.SendData str

End Sub

Dus de hoofdletters & versie nr waren fout.
Pagina: 1