和GET方法一样,POST方法也是HTTP协议中的一个重要组成部分。POST方法一般用来向目的服务器发出请求,并附有请求实体。
POST被设计成用统一的方法实现下列功能:
     o 对现有资源的注释(Annotation of existing resources);
     o 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息;
     o 提交数据块,如将表格(form)的结果提交给数据处理过程;
     o 通过附加操作来扩展数据库。
     o 也可用来上传文件。

在所有的HTTP的POST请求中,必须指定合法的内容长度(Content-Length)。
如果HTTP/1.0服务器在接收到请求消息内容时无法确定其长度,就会返回400(非法请求)代码。
应用程序不能缓存对POST请求的回应,因为做为应用程序来说,它们没有办法知道服务器在未来的请求中将如何回应。

POST方式和GET方法的最大区别就是把发送的数据和URI地址分离。请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form-urlencoded。

Post请求格式如下:
POST /login.asp HTTP/1.1
Accept: */*
Referer: http://www.wantsoft.com
Accept-Language: zh-cn,en-us;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; .NET CLR 1.0.3705; .NET CLR 1.1.4322)
Host: www.wantsoft.com
Content-Length: 35
Pragma: no-cache
Cache-Control: no-cache
username=wantsoft&password=password   //post的数据

应答格式如下:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Fri, 05 Dec 2008 15:44:38 GMT
Content-Length: 27
Content-Type: text/html
Cache-control: private
welcome to www.wantsoft.com         //网页的正文内容

使用类CHttpConnection完成http post的代码如下:
BOOL PostRequest(LPCTSTR lpszURL,         // 如:www.wantsoft.com
       LPCTSTR lpszObjectName,         // 如index.asp
       LPCTSTR lpszOptionalData,                       // 如:username=chrys&password=MyPassword
       LPCTSTR lpszReferer,         // 如:/modify-new.htm
       OUT CString &csResponse)
{

     BOOL bRet = FALSE;
     CString csHeaders, csOptionalData = lpszOptionalData, csContentLength;
     csContentLength.Format ( “Content-Length: %dn”, csOptionalData.GetLength() );

     csHeaders += “Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*n”;
     csHeaders += “Referer: http://“;
     csHeaders += lpszURL;
     csHeaders += lpszReferer;
     csHeaders += “n”;
     csHeaders += “Accept-Language: zh-cn,en-us;q=0.5n”;
     csHeaders += “Content-Type: application/x-www-form-urlencodedn”;
     csHeaders += “Proxy-Connection: Keep-Aliven”;
     csHeaders += “User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; .NET CLR 1.0.3705; .NET CLR 1.1.4322)n”;
     csHeaders += “Host: “;
     csHeaders += lpszURL;
     csHeaders += “n”;
     csHeaders += csContentLength;
     csHeaders += “Pragma: no-cachen”;
     csHeaders += “rn”;

     CHttpFile* pMyHttpFile = NULL;
     CHttpConnection* pConnection = NULL;
     CInternetSession mySession;
     try
     {
         mySession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10*1000);  
         pConnection = mySession.GetHttpConnection(_T(lpszURL));
         pMyHttpFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, lpszObjectName);
         if ( pMyHttpFile->SendRequest(csHeaders,
             (LPVOID)(LPCTSTR)csOptionalData, csOptionalData.GetLength()) )
         {
             DWORD dwStatus;
             DWORD dwBuffLen = sizeof(dwStatus);
             pMyHttpFile->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);
             if ( HTTP_STATUS_OK == dwStatus )
             {
                 csResponse.Empty ();
                 CString myData;
                 while ( pMyHttpFile->ReadString ( myData ) )
                 {
                     csResponse += myData;
                 }
                 bRet = TRUE;
             }
         }
     }
     catch ( CInternetException* pEx )
     {
         bRet = FALSE;
         TCHAR   szErr[1024]={0};
         pEx->GetErrorMessage(szErr,1024);
         pEx->Delete();
     }

     if ( pMyHttpFile )
     {
         pMyHttpFile->Close();
         delete pMyHttpFile;
     }
     if ( pConnection )
     {
         pConnection->Close();
         delete pConnection;
     }
     mySession.Close();
     return bRet;
}


本文版权属于《Visual C++网络游戏建模与实现》作者苏羽和http://www.wantsoft.com共同所有,引用者请务必保留本行版权信息,否则作者苏羽和http://www.wantsoft.com保留追究的权利。

Comments are closed.

Post Navigation