OeilNoir
asked on
HTTP Posting with VB
With a VB program, i need to post something to the webserver, how can i do it? (just like someone was pressing on "Submit" from an html form...)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You are right. This example sucked
HOWTO: Automate Internet Explorer to POST Form Data
Last reviewed: January 19, 1998
Article ID: Q167658
-------------------------- ---------- ---------- ---------- ---------- ---------- ----
The information in this article applies to:
Microsoft ActiveX SDK, version 1.0
Internet Client SDK, versions 4.0, 4.01
Microsoft Internet Explorer (Programming), versions 3.0, 3.01, 3.02, 4.0
SUMMARY
An automation controller such as Microsoft Visual Basic can automate Internet Explorer (IE) to send data using the POST method to an HTTP server such as Internet Information Server (IIS). This article demonstrates how to automate IE to perform a POST of form data from Visual Basic and from a simple Visual C++ application. While the examples illustrate automation of the whole Internet Explorer application, the same techniques can be applied to the Web Browser ActiveX control when it is hosted in an application.
MORE INFORMATION
Several methods are available for sending data to an HTTP server. GET and POST are currently the most common. POST is typically used to submit form data to an HTTP server when that data exceeds the maximum allowable transfer using the GET method. This limit is typically 2K.
IE exposes the IWebBrowser(App) interface to automation controllers. The IWebBrowser(App) interface exposes a Navigate method. In interface definition language (IDL) syntax (a universal representation from which both the Visual Basic and Visual C++ syntax is derived), the Navigate method looks like the following:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
[in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
[in] VARIANT* Headers);
For the purposes of performing a POST, only the URL, PostData, and Headers parameters are relevant. See the Internet Client SDK documentation for information on the other parameters.
To call Navigate and POST form data to an HTTP server, the URL parameter must specify a valid address, the PostData parameter must contain a SAFEARRAY of bytes, and the Headers parameter must contain a BSTR that contains the following HTTP header:
Content-Type: application/x-www-form-url encoded
This header indicates that the data being posted is encoded according to the rules specified in the HTML specification.
Internet Explorer versions 3.0, 3.01, and 3.02 do not support posting data to an HTTP server via the Navigate method. WinInet and URL Monikers are two possible alternatives. For more information on WinInet and Monikers, see the REFERENCES section of this article.
Note that the Internet Explorer Script Object Model object "window" has a "navigate" method as well. This navigate method will only accept a URL and cannot be used to POST data to a web server.
To test the examples below, the following Active Server Page (ASP) should be saved to the file NAVPOST.ASP in a directory on an NT 4.0 server running Internet Information Server (IIS) version 3.0. The directory should be recognized by IIS as a virtual root with execute permission:
<HTML>
<%
cFlavor = Request("Flavor")
cName = Request("FName")
%>
<BODY>
Hello, <% =cName %>. <br>
One scoop of <% =cFlavor %> coming right up!
</BODY>
</HTML>
Visual Basic
To demonstrate a POST in Visual Basic, perform the following steps:
Start a new Standard EXE project in Visual Basic. Form1 is created by default. Add the following controls to Form1:
Object Name Caption
-------------------------- ---------- ---------- ---------- ---------- -
Label lblName First Name
Label lblFlavor Flavor
CommandButton cmdSubmit Submit
ComboBox cboFlavor
TextBox txtName
TextBox edtPostData
(edtPostData should be multi-line and have scroll bars)
Invoke "References" from the Project menu and add a reference to the project for "Microsoft Internet Controls" (SHDOCVW.DLL). Make sure this is done from the References dialog and not just from the Components dialog.
Insert the following code in the General Declarations section:
Dim g_oIE As InternetExplorer ' Global reference to an
' instance of IE
Private Sub cmdSubmit_Click()
edtPostData.Text = "" ' Initialize an edit box for testing
ReDim aByte(0) As Byte ' Array of bytes to hold data to post
' Extract the URL encoded data from the UI,
' and pack it into an array of bytes
cFlavor = cboFlavor.List(cboFlavor.L istIndex)
cParamName = "FName="
cParamFlavor = "Flavor="
cSeparator = "&"
cPostData = cParamName & txtName.Text _
& cSeparator & cParamFlavor & cFlavor
PackBytes aByte(), cPostData
' For testing, rebuild the POST data and stuff
' it into an edit box
For i = LBound(aByte) To UBound(aByte)
edtPostData = edtPostData + Chr(aByte(i))
Next
Dim vPost As Variant
vPost = aByte ' Assign the byte array to a VARIANT
Dim vFlags As Variant
Dim vTarget As Variant
Dim vHeaders As Variant
vHeaders = _
"Content-Type: application/x-www-form-url encoded" _
+ Chr(10) + Chr(13)
' You're done. Now call Navigate
' Note: modify path to server as appropriate
g_oIE.Navigate "http://<server>/scripts/navpost. asp", _
vFlags, vTarget, vPost, vHeaders
End Sub
Private Sub Form_Load()
' Create an instance of IE
Set g_oIE = New InternetExplorer
g_oIE.Visible = True
' Populate a combobox with some flavor choices
cboFlavor.List(0) = "Vanilla"
cboFlavor.List(1) = "Chocolate"
cboFlavor.List(2) = "Strawberry"
cboFlavor.ListIndex = 0 ' The default choice
End Sub
' Utility function to pack the data to post into an array of bytes
Private Sub PackBytes(ByteArray() As Byte, ByVal PostData As String)
iNewBytes = Len(PostData)
If iNewBytes = 0 Then
Exit Sub
End If
iCursize = UBound(ByteArray) - LBound(ByteArray)
ReDim Preserve ByteArray(iNewBytes + iCursize)
For i = 1 To iNewBytes
ch = Mid(PostData, i, 1)
If ch = Space(1) Then
ch = "+"
End If
ByteArray(i + iCursize - 1) = Asc(ch)
Next
End Sub
Modify the URL in the call to Navigate as appropriate, close all running instance of IE, and choose Start from the Run menu.
Enter your name in the first name textbox, choose a flavor, and click the Submit command button. The data from the Visual Basic form will be posted to the HTTP server and the response will appear in the visible browser window.
HOWTO: Automate Internet Explorer to POST Form Data
Last reviewed: January 19, 1998
Article ID: Q167658
--------------------------
The information in this article applies to:
Microsoft ActiveX SDK, version 1.0
Internet Client SDK, versions 4.0, 4.01
Microsoft Internet Explorer (Programming), versions 3.0, 3.01, 3.02, 4.0
SUMMARY
An automation controller such as Microsoft Visual Basic can automate Internet Explorer (IE) to send data using the POST method to an HTTP server such as Internet Information Server (IIS). This article demonstrates how to automate IE to perform a POST of form data from Visual Basic and from a simple Visual C++ application. While the examples illustrate automation of the whole Internet Explorer application, the same techniques can be applied to the Web Browser ActiveX control when it is hosted in an application.
MORE INFORMATION
Several methods are available for sending data to an HTTP server. GET and POST are currently the most common. POST is typically used to submit form data to an HTTP server when that data exceeds the maximum allowable transfer using the GET method. This limit is typically 2K.
IE exposes the IWebBrowser(App) interface to automation controllers. The IWebBrowser(App) interface exposes a Navigate method. In interface definition language (IDL) syntax (a universal representation from which both the Visual Basic and Visual C++ syntax is derived), the Navigate method looks like the following:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
[in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
[in] VARIANT* Headers);
For the purposes of performing a POST, only the URL, PostData, and Headers parameters are relevant. See the Internet Client SDK documentation for information on the other parameters.
To call Navigate and POST form data to an HTTP server, the URL parameter must specify a valid address, the PostData parameter must contain a SAFEARRAY of bytes, and the Headers parameter must contain a BSTR that contains the following HTTP header:
Content-Type: application/x-www-form-url
This header indicates that the data being posted is encoded according to the rules specified in the HTML specification.
Internet Explorer versions 3.0, 3.01, and 3.02 do not support posting data to an HTTP server via the Navigate method. WinInet and URL Monikers are two possible alternatives. For more information on WinInet and Monikers, see the REFERENCES section of this article.
Note that the Internet Explorer Script Object Model object "window" has a "navigate" method as well. This navigate method will only accept a URL and cannot be used to POST data to a web server.
To test the examples below, the following Active Server Page (ASP) should be saved to the file NAVPOST.ASP in a directory on an NT 4.0 server running Internet Information Server (IIS) version 3.0. The directory should be recognized by IIS as a virtual root with execute permission:
<HTML>
<%
cFlavor = Request("Flavor")
cName = Request("FName")
%>
<BODY>
Hello, <% =cName %>. <br>
One scoop of <% =cFlavor %> coming right up!
</BODY>
</HTML>
Visual Basic
To demonstrate a POST in Visual Basic, perform the following steps:
Start a new Standard EXE project in Visual Basic. Form1 is created by default. Add the following controls to Form1:
Object Name Caption
--------------------------
Label lblName First Name
Label lblFlavor Flavor
CommandButton cmdSubmit Submit
ComboBox cboFlavor
TextBox txtName
TextBox edtPostData
(edtPostData should be multi-line and have scroll bars)
Invoke "References" from the Project menu and add a reference to the project for "Microsoft Internet Controls" (SHDOCVW.DLL). Make sure this is done from the References dialog and not just from the Components dialog.
Insert the following code in the General Declarations section:
Dim g_oIE As InternetExplorer ' Global reference to an
' instance of IE
Private Sub cmdSubmit_Click()
edtPostData.Text = "" ' Initialize an edit box for testing
ReDim aByte(0) As Byte ' Array of bytes to hold data to post
' Extract the URL encoded data from the UI,
' and pack it into an array of bytes
cFlavor = cboFlavor.List(cboFlavor.L
cParamName = "FName="
cParamFlavor = "Flavor="
cSeparator = "&"
cPostData = cParamName & txtName.Text _
& cSeparator & cParamFlavor & cFlavor
PackBytes aByte(), cPostData
' For testing, rebuild the POST data and stuff
' it into an edit box
For i = LBound(aByte) To UBound(aByte)
edtPostData = edtPostData + Chr(aByte(i))
Next
Dim vPost As Variant
vPost = aByte ' Assign the byte array to a VARIANT
Dim vFlags As Variant
Dim vTarget As Variant
Dim vHeaders As Variant
vHeaders = _
"Content-Type: application/x-www-form-url
+ Chr(10) + Chr(13)
' You're done. Now call Navigate
' Note: modify path to server as appropriate
g_oIE.Navigate "http://<server>/scripts/navpost.
vFlags, vTarget, vPost, vHeaders
End Sub
Private Sub Form_Load()
' Create an instance of IE
Set g_oIE = New InternetExplorer
g_oIE.Visible = True
' Populate a combobox with some flavor choices
cboFlavor.List(0) = "Vanilla"
cboFlavor.List(1) = "Chocolate"
cboFlavor.List(2) = "Strawberry"
cboFlavor.ListIndex = 0 ' The default choice
End Sub
' Utility function to pack the data to post into an array of bytes
Private Sub PackBytes(ByteArray() As Byte, ByVal PostData As String)
iNewBytes = Len(PostData)
If iNewBytes = 0 Then
Exit Sub
End If
iCursize = UBound(ByteArray) - LBound(ByteArray)
ReDim Preserve ByteArray(iNewBytes + iCursize)
For i = 1 To iNewBytes
ch = Mid(PostData, i, 1)
If ch = Space(1) Then
ch = "+"
End If
ByteArray(i + iCursize - 1) = Asc(ch)
Next
End Sub
Modify the URL in the call to Navigate as appropriate, close all running instance of IE, and choose Start from the Run menu.
Enter your name in the first name textbox, choose a flavor, and click the Submit command button. The data from the Visual Basic form will be posted to the HTTP server and the response will appear in the visible browser window.
ASKER
mmm... the exemple isn't working..
Run Time Error 430 :
Class does not support Automation or does not support exepected interface
Anyway, i think i still managed to figure out what i wanted to know... that is, how they were formating the Post variable.
So, if i understood well.. what they put in post, is simply the what we could add to the url to pass some parameters.? Exemple :
with this url:
http://www.url.com/path/file.ext
if i have the parameters :
Variable1 and Variable2
i could either use
vPost = variable1=value1&variable2 =value2
Headers = "Content-Type: application/x-www-form-url encoded" & vbCrLf
'no matter what th vFlags are VTarget are...
object.Navigate "http://www.url.com/path/file.ext", vFlags, vTarget, vPost, vHeaders
Or i could do :
Headers = "Content-Type: application/x-www-form-url encoded" & vbCrLf
object.Navigate "http://www.url.com/path/file.ext?variable1=value1&variable2=value2", , , , Headers
So, basicaly, my question is : is it the same thing to put the "variables strings" in the VPost Variable or to just concatenate it to the url?
Run Time Error 430 :
Class does not support Automation or does not support exepected interface
Anyway, i think i still managed to figure out what i wanted to know... that is, how they were formating the Post variable.
So, if i understood well.. what they put in post, is simply the what we could add to the url to pass some parameters.? Exemple :
with this url:
http://www.url.com/path/file.ext
if i have the parameters :
Variable1 and Variable2
i could either use
vPost = variable1=value1&variable2
Headers = "Content-Type: application/x-www-form-url
'no matter what th vFlags are VTarget are...
object.Navigate "http://www.url.com/path/file.ext", vFlags, vTarget, vPost, vHeaders
Or i could do :
Headers = "Content-Type: application/x-www-form-url
object.Navigate "http://www.url.com/path/file.ext?variable1=value1&variable2=value2", , , , Headers
So, basicaly, my question is : is it the same thing to put the "variables strings" in the VPost Variable or to just concatenate it to the url?
With the right quotation"", both will work..
ASKER
Thanks, i guess it answer my question....
just one more thing, what do you mean exactly by "with the right quotation"?
just one more thing, what do you mean exactly by "with the right quotation"?
ASKER
Also, i was wondering, could i get the same result with inet1.openurl ?
(that is to post)
(that is to post)
ASKER
The reason i ask that, is that when i do the post, i must find a way to verify the result, did it worked? and etc.... or, is there a way to get "see" the html code with the webbrowser control?
ASKER
usualy, when i do a post on a server,i'm sending variables, with their values...
here, all what is see is that :
-> PostData = "Information sent to host"
isn't there a certain way this have to be formatted? how do i tell it what are the variables and the values?