You are currently offline, waiting for your internet to reconnect

How to simulate a Form POST request by using WinInet

This article was previously published under Q165298
This article has been archived. It is offered "as is" and will no longer be updated.
To properly simulate a Form submission using WinInet, you need to send aheader that indicates the proper Content-Type. For Forms, the properContent-Type header is:
Content-Type: application/x-www-form-urlencoded				
In many cases, the server does not respond appropriately if a Content-Typeis not specified. For example, the Active Server Pages component of IIS 3.0actually checks this header specifically for 'application/x-www-form-urlencoded' before adding form variables to the "Request.Form" object.This MIME/Content-Type indicates that the data of the request is a list ofURL- encoded form variables. URL-encoding means that space character (ASCII32) is encoded as '+', special character such '!' encoded in hexadecimalform as '%21'.

Here is a snippet of code that uses the MFC WinInet classes to simulate aForm POST request:
   CString strHeaders =      _T("Content-Type: application/x-www-form-urlencoded");   // URL-encoded form variables -   // name = "John Doe", userid = "hithere", other = "P&Q"   CString strFormData = _T("name=John+Doe&userid=hithere&other=P%26Q");   CInternetSession session;   CHttpConnection* pConnection =      session.GetHttpConnection(_T("ServerNameHere"));   CHttpFile* pFile =      pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,                              _T("FormActionHere"));   BOOL result = pFile->SendRequest(strHeaders,      (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());				
Without MFC, the same code translates to straight SDK calls as follows:
   static TCHAR hdrs[] =      _T("Content-Type: application/x-www-form-urlencoded");   static TCHAR frmdata[] =      _T("name=John+Doe&userid=hithere&other=P%26Q");  static LPSTR accept[2]={"*/*", NULL};   // for clarity, error-checking has been removed   HINTERNET hSession = InternetOpen("MyAgent",      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);   HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",      _T("FormActionHere"), NULL, NULL, accept, 0, 1);   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));   // close any valid internet-handles				
For more information about URL-encoding and the format of a Form POST request,see section 8.2 in RFC 1866.

Article ID: 165298 - Last Review: 12/04/2015 16:34:53 - Revision: 2.0

Microsoft Foundation Class Library 4.2, Microsoft Windows Internet Services (WinInet)

  • kbnosurvey kbarchive kbhowto kbprogramming KB165298