Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials
Autor
Nachricht
Marduk
Überflieger
Überflieger

Anmeldedatum: 16.04.2008
Beiträge: 374

Arbeiten mit der HttpWebRequest Klasse
Verfasst am: 08.06.2008, 14:26

Da hier einige "Probleme" bei einigen Web-Geschichten mit dem Webbrowser haben, zeige ich euch mal wie man mit der HTTPWebRequest-Klasse arbeitet. Das Arbeiten mit dem Webbrowser mag zwar für einige Sachen sehr bequem und einfach sein, es ist irgenwie immer eine Hilfslösung. Will man dann Daten per POST schicken, sieht man beim Webbrowser alt aus.

Naja, erst mal was einfaches, lassen wir uns einfach mal den Quelltext einer Seite anzeigen.

Dazu deklarieren wir uns einen Request, eine Response und einen StreamReader.
Am besten importiert ihr euch am Anfang die Namspaces Net und IO.
Visual Basic: [code]Imports System.Net
Imports System.IO[/code]

Um das ganze später leicht in andere Projekte einzubauen, erstellen wir uns am besten eine neue Klasse namens work_with_http.

Als erste Funktion wollen wir nur den Quelltext der Seite laden und zurückgeben lassen. Dazu übergeben wir der Funktion die URL der Seite. Anschließend deklarieren wir unseren Request der HttpWebRequest-Klasse und weisen ihr unseren WebRequest der URL zu. Danach deklarieren wir uns die Response des Servers und holen diese mit der GetResponse-Methode der Request-Klasse. Jetzt haben wir eigentlich schon die Anfrage an den Server übermittelt und auch schon seine Antwort erhalten. Da wir aber noch den Quelltext wollen, deklarieren wir uns einen StreamReader, der den Antwortstream abholt und uns den Quelltext übermittelt.
Das ganze sieht in Code-Form so aus:
Visual Basic: [code]
Function get_sourcecode(ByVal url As String) As String
Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
Dim res As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
Dim str As New StreamReader(res.GetResponseStream)
Return str.ReadToEnd()
End Function
[/code]

Das Senden der Daten per POST verlangt etwas mehr. Wir erstellen daher wieder eine Funktion mit der URL und der POST-Daten als Parameter. Der Quelltext der "Antwortseite" wird auch diesesmal zurückgegeben. Da unsere Daten noch im Stringformat vorliegen und der Server aber Bytes für die Übertragung benötigt, konvertieren wir erst mal die Daten in ein Byte-Array. Danach müssen wir an den Request-Eigenschaften etwas Hand anlegen. der Method-Eigenschaft weisen wir den Wert post zu, da wir die Daten ja nicht per URL übermitteln wollen. Wäre ja auch zu einfach:D Die ContentLength-Eigenschaft vom Typ Long bekommt den Wert der Länge des Daten-Arrays. Den ContentType setzen wir auf "application/x-www-form-urlencoded". Und da manche php/perl Skripte auf den User-Agent/Referer achten um Attacken abzuwehren/vorzubeugen legen wir auch gleich einen User-Agent und Referer fest. Um jetzt wirklich die Daten zu senden, besorgen wir uns den Requeststream und schreiben in diesen unser Daten-Array. Die übrigen Sachen sind die gleichen wie bei unserer ersten Funktion, und sind zum Erhalten der Server-Antwort und des Antwortquelltexts.
So sieht dann unsere Funktion zum Senden von Daten per POST aus:
Visual Basic: [code]
Function send_data(ByVal url As String, ByVal postdata As String) As String
Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(postdata)

Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
req.Method = "post"
req.ContentType = "application/x-www-form-urlencoded"
req.ContentLength = data.Length
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"

Dim dataStream As Stream = req.GetRequestStream()
dataStream.Write(data, 0, data.Length)

Dim res As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
Dim str As New StreamReader(res.GetResponseStream)

Return str.ReadToEnd()
End Function
[/code]

Da es auf manchen Seiten reicht den Cookie anzugeben um in den Memberbereich zu kommen, zeige ich das auch noch.
Neben der URL könnt ihr nun einen fertige Variable des Typs Cookie übergeben, oder die benötigten Daten (name, value, path, domain) per Parameter übergeben lassen. Die zweite Variante ist in meinen Augen die elegantere, da man somit die Klasse besser portieren kann. Falls man mehrere Cookies übergeben will, kann man einfach ein Array draus machen und schon sind mehrere Cookie in dem Request. Der Grundaufbau sollte jetzt klar sein, wir fügen jetzt einfach noch einen Cookie mit unseren übergebenen Werten hinzu. Ist das getan, deklarieren wir uns noch einen CookieContainer und fügen diesem unseren Cookie ein. Jetzt wird nur noch dem Request unseren CookieContainer zugewiesen und fertig sind wir schon mit den Cookies.
Visual Basic: [code]
Dim cc As New CookieContainer
Dim _cookie As New Cookie(name, value, path, domain)
cc.Add(cookie)
cc.Add(_cookie)
req.CookieContainer = cc
[/code]

So, das war es erst mal mit der HttpWebRequest-Klasse, man kann zwar noch einiges damit machen, zb eine Datei damit download, aber dazu komme ich später, würde den Rahmen sprengen.
Ich hoffe es hat euch gefallen und ihr konntet was lernen dabei Very Happy

Bis zum nächsten mal
euer Marduk
_________________
 
sollniss
Überflieger
Überflieger

Anmeldedatum: 01.05.2008
Beiträge: 699


Verfasst am: 30.06.2008, 10:12

Also ich find die GetSourcecode Funktion genial. Leider ist mir jetzt aufgefallen, dass man damit keine Weiterleitungsseiten abfragen kann.

Ich will zum Beispiel den Source einer zufälligen Wikipedia SeiteVisual Basic: [code]Dim Source as String = GetSourcecode("http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite")[/code]da bekomm ich den Fehler
Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig.
und die ZeileVisual Basic: [code]Dim res As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)[/code]wird markiert.

Kann man das irgendwie fixen, oder muss ich damit leben?
 
Marduk
Überflieger
Überflieger

Anmeldedatum: 16.04.2008
Beiträge: 374


Verfasst am: 30.06.2008, 18:17

Das Problem dabei ist, dass du kein wirkliches Skript direkt ansprichst.
Hier sind mal zwei Links, mit denen du verschiedene Artikelarten zufällig ansteuern kannst.

http://toolserver.org/~dapete/random/dewiki-lesenswert.php
http://toolserver.org/~dapete/random/dewiki-exzellent.php
_________________


 
sollniss
Überflieger
Überflieger

Anmeldedatum: 01.05.2008
Beiträge: 699


Verfasst am: 30.06.2008, 18:42


Naja, eigendlich will ich den Link hier ansteuern:
http://de.wiktionary.org/wiki/Spezial:Zuf%C3%A4llige_Seite

Das normale Wikipedia war hald schneller zur Hand. :/
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials

Tags: visual basic, httpwebrequest, webrequest, request

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Visual Basic Download ? 1743 03.05.2011, 07:38
Keine neuen Beiträge Api Download in Prozent + Kb anzeige + Progrezzbar 1345 21.10.2007, 13:03
Keine neuen Beiträge Download 1359 30.08.2007, 15:45
Keine neuen Beiträge Download mit Internet Explorer Object 923 18.08.2008, 19:00
Keine neuen Beiträge Visual Basic 6 download 3701 26.05.2007, 11:51
 




[ Time: 0.2422s ][ Queries: 93 (0.0542s) ][ GZIP on - Debug on ]