VB .NET Http Post Request Program Example

< C# Http Post Request Program Example | Main | Asynchronous HTTP & Misc. > Chapter 10 Part 7: HTTP with .NET What do we have in this chapter 10 Part 7?
  1. VB .NET Http Post Request Program Example
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.

VB .NET Http Post Request Program Example - a new class library project creation in Visual Studio IDE

Rename the source file to HttpPostRequest to reflect the application that we want to develop.

VB .NET Http Post Request Program Example - renaming the source file

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.

VB .NET Http Post Request Program Example - invoking the Add Reference page

In the .NET tab, select the System.Web and click the OK button.

VB .NET Http Post Request Program Example - selecting the System.Web (Web.dll) component

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.

VB .NET Http Post Request Program Example - invoking the project's property page

Change the Application type: to Console Application and the Startup object: to Sub Main.

VB .NET Http Post Request Program Example - changing the Application type: to Console Application and the Startup object: to Main() subroutine

Build and run the project.

VB .NET Http Post Request Program Example - bilding the project

The following is the output sample using the default argument values.

VB .NET Http Post Request Program Example - a sample output using 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

VB .NET Http Post Request Program Example - a sample output with supplied argument values

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

VB .NET Http Post Request Program Example - another sample output with supplied arguments

< C# Http Post Request Program Example | Main | Asynchronous HTTP & Misc. >

Từ khóa » Visual Basic Send Http Request