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
Bis zum nächsten mal euer Marduk _________________
sollniss Ü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
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.