VB .NET Http Post Request Program Example
Create a new class library project and you might want to use HttpPostRequestVB as the project and solution names.
|
|
Rename the source file to HttpPostRequest to reflect the application that we want to develop.
Add the following Imports directives.
Imports System Imports System.Net Imports System.IO Imports System.Text Imports System.Web |
Add the HttpPostRequest class code that include the Main() subroutine.
' Simple class that encapsulates the HTTP post sample. Public Class HttpPostRequest ' Displays simple usage information. Shared Sub usage() Console.WriteLine("Executable_file_name [-u URL] [-d data] [-s file] [-p proxy]") Console.WriteLine("Available options:") Console.WriteLine(" -u URL URL to post data to") Console.WriteLine(" -d data Data to post") Console.WriteLine(" -s file File name to save response to") Console.WriteLine(" -p HTTP URL Proxy to use for post operation") Console.WriteLine() End Sub
' This routine validates the data being posted to the web page. It parses ' the string for reserved characters '?', '=', and '&'. The individual ' validated parts are returned via a StringBuilder object. ' <param name="postData">Data to validate</param> ' <returns>StringBuilder object representing the parsed elements</returns> Public Function ValidatePostData(ByVal postData As String) As StringBuilder Dim encodedPostData As StringBuilder = New StringBuilder() ' These characters should be more out there... Dim reservedChars() As Char = {"?", "=", "&", "+"} Dim pos As Integer Dim offset As Integer
' Validate the data to be posted Console.WriteLine("Validating the data to be posted...") offset = 0 While (offset < postData.Length) pos = postData.IndexOfAny(reservedChars, offset) If (pos = -1) Then ' Append the remaining part of the string Console.WriteLine("Appending the remaining part of the string...") encodedPostData.Append(HttpUtility.UrlEncode( _ postData.Substring(offset, postData.Length - offset))) Exit While End If ' Found a special character so append up to the special character Console.WriteLine("Found a special character so append up to the special character...") encodedPostData.Append(HttpUtility.UrlEncode( _ postData.Substring(offset, pos - offset))) encodedPostData.Append(postData.Substring(pos, 1)) offset = pos + 1 End While ValidatePostData = encodedPostData End Function
' This method creates an HttpWebRequest object, sets the method to "POST", ' and builds the data to post. Once the HttpWebRequest object is created, ' the request stream is obtained and the post data is sent and the ' request stream closed. The response is then retrieved. ' <param name="postUrl">URL to post data to</param> ' <param name="postData">Data to post</param> ' <param name="proxyServer">Proxy server to use</param> ' <param name="saveFile">Filename to save response to</param> Public Sub HttpMethodPost( _ ByVal postUrl As String, _ ByVal postData As String, _ ByVal proxyServer As IWebProxy, _ ByVal saveFile As String)
Dim httpRequest As HttpWebRequest = Nothing Dim httpResponse As HttpWebResponse = Nothing Dim httpPostStream As Stream = Nothing Dim httpResponseStream As BinaryReader = Nothing Dim localFile As FileStream = Nothing
Try Dim encodedPostData As StringBuilder Dim postBytes() As Byte = Nothing
' Create HTTP web request Console.WriteLine("Creating HTTP web request...") httpRequest = CType(WebRequest.Create(postUrl), HttpWebRequest) ' Change method from the default "GET" to "POST" Console.WriteLine("Changing method from the default GET to POST...") httpRequest.Method = "POST" ' Posted forms need to be encoded so change the content type Console.WriteLine("Changing the content type (encoding)...") httpRequest.ContentType = "application/x-www-form-urlencoded" ' Set the proxy Console.WriteLine("Setting the proxy...") httpRequest.Proxy = proxyServer ' Validate and encode the data to POST Console.WriteLine("Validating and encode the data to POST...") encodedPostData = ValidatePostData(postData)
Console.WriteLine("Encoded POST string: '{0}'", encodedPostData.ToString())
' Retrieve a byte array representation of the data Console.WriteLine("Retrieving a byte array representation of the data...") postBytes = Encoding.UTF8.GetBytes(encodedPostData.ToString()) ' Set the content length (the number of bytes in the POST request) Console.WriteLine("Setting the content length - the number of bytes in the POST request...") httpRequest.ContentLength = postBytes.Length ' Retrieve the request stream so we can write the POST data Console.WriteLine("Retrieving the request stream so we can write the POST data...") httpPostStream = httpRequest.GetRequestStream() ' Write the POST request Console.WriteLine("Writing the POST request...") httpPostStream.Write(postBytes, 0, postBytes.Length)
httpPostStream.Close() httpPostStream = Nothing
' Retrieve the response Console.WriteLine("Retrieving the response...") httpResponse = CType(httpRequest.GetResponse(), HttpWebResponse) ' Retrieve the response stream Console.WriteLine("Retrieving the response stream...") httpResponseStream = New BinaryReader( _ httpResponse.GetResponseStream(), _ Encoding.UTF8 _ )
Dim readData() As Byte
' Open the file to save the response to Console.WriteLine("Opening the file to save the response to...") localFile = File.Open( _ saveFile, _ System.IO.FileMode.Create, _ System.IO.FileAccess.Write, _ System.IO.FileShare.None _ ) Console.WriteLine("Saving response to: {0}", localFile.Name) Console.WriteLine("Receiving response...")
' Receive the response stream until the end Console.WriteLine("Receiving the response stream until the end...") Dim count As Integer = 0 Dim percent As Long
While (True) readData = httpResponseStream.ReadBytes(4096) If (readData.Length = 0) Then Exit While End If
localFile.Write(readData, 0, readData.Length)
' Calculate the progress and display to the console count += readData.Length percent = (count * 100) / httpResponse.ContentLength
' Console.WriteLine(" ") Console.WriteLine("{0}% progress...", percent.ToString().PadLeft(2)) End While Console.WriteLine() Catch wex As WebException Console.WriteLine("Exception occurred: {0}", wex.ToString()) httpResponse = CType(wex.Response, HttpWebResponse) Finally ' Close any remaining resources Console.WriteLine("Closing any remaining resources...") If (Not IsNothing(httpResponse)) Then httpResponse.Close() End If If (Not IsNothing(localFile)) Then localFile.Close() End If End Try End Sub
' This is the main routine that parses the command line and calls routines to ' issue the POST request and receive the response. ' <param name="args">Command line arguments</param> Shared Sub Main() Dim proxyServer As IWebProxy Dim uriToPost As String = "http://search.msdn.microsoft.com/" Dim proxyName As String = Nothing Dim postData As String = "Default.aspx?Query=web.dll" Dim fileName As String = Nothing ' Parse the command line Dim args As String() = Environment.GetCommandLineArgs() Dim i As Integer
usage()
For i = 1 To args.GetUpperBound(0) Try Dim CurArg() As Char = args(i).ToCharArray(0, args(i).Length) If (CurArg(0) = "-") Or (CurArg(0) = "/") Then Select Case Char.ToLower(CurArg(1), System.Globalization.CultureInfo.CurrentCulture) Case "u" ' URI to post to i = i + 1 uriToPost = args(i) Case "p" ' Name of proxy server to use i = i + 1 proxyName = args(i) Case "d" ' Retrieve all referenced images and text on the same host i = i + 1 postData = args(i) Case "s" ' Local save path to append to retrieved resources i = i + 1 fileName = args(i) Case Else usage() Exit Sub End Select End If Catch e As Exception usage() Exit Sub End Try Next Try Dim httpPost As HttpPostRequest = New HttpPostRequest()
' Set the proxy if supplied or use the default IE static proxy Console.WriteLine("Setting the proxy if supplied or use the default IE static proxy...") If (IsNothing(proxyName)) Then proxyServer = WebRequest.DefaultWebProxy Else ' Must cast it to IWebProxy if needed, not done here proxyServer = New WebProxy(proxyName) End If ' Post the request and write the response to the file Console.WriteLine("Posting the request and write the response to the file...") httpPost.HttpMethodPost(uriToPost, postData, proxyServer, fileName) Catch ex As Exception Console.WriteLine("Exception occurred: {0}", ex.Message) End Try End Sub End Class
|
Build the project. Well, in this case the following error displayed. The System.Web in the Imports directive seems not working.
error BC30451: Name 'HttpUtility' is not declared.
Let try adding the System.Web manually. Select the project folder > Right click mouse > Select Add Reference context menu.
In the .NET tab, select the System.Web and click the OK button.
To test this program we need to change the DLL to the application (EXE) type program so that we can run it from the command prompt. Select the project folder > Right click mouse > Select Properties context menu.
Change the Application type: to Console Application and the Startup object: to Sub Main.
Build and run the project.
![]() |
|
The following is the output sample using the default argument values.
The following output sample is based on the following arguments:
httppostrequestvb -u http://search.msdn.microsoft.com/ -d Default.aspx?Query=web.dll -s testvb.htm
The following snapshot is an output sample based on the following arguments:
httppostrequestvb -u http://www.google.com/ -d search?as_q=tenouk -s testvb1.htm