(粤版/香港文字)

HTTP POST其實可以講喺互聨網溝通程序。。。又用户(client)游览器呈報數据到伺服器(server)喥(例如jsp,asp,php以及其它scripting 語言)處,然後輸出某些预設嘅答案。詳细解釋請閱讀rfc2616.pdf文件;此文件非常容易喺互聨網喥搜索得到,尤其喺W3C官方網站。

一般我哋都喺將個HTTP POST運用喺asp-asp,jsp-jsp或asp-jsp網頁溝通程式上。。。啱冇。。。 你有冇想過引用此方案于一般桌面(Desktop)程式上?例如 VB6或VC++咁?

举個例子;如果一個Win32 application需要一個用户驗証登入界面,但問題喺往往喺大機構里面只得總機(伺服器)嘅數据庫先會存有用户嘅資料同登入密碼。

一般人會答:“直接联系嗰數据庫及讀取應要嘅資料咪得囖。。。何必搞到咁腹雜咁麻煩吖。”

啱,如果個方案喺限于一間機構里運作;但萬一喺運作于多間機構于唔同地點呢?喺咁做嘅話,你有冇念過安全嘅問題呢?

也許亦有人答:“通常大機構都有VPN嗎~”

啱,但就一定波及多方面嘅人力資源先能達到预期效果囖。。。

跟住就會有人補充:“不如用WebServices啦!”

答得好;而我想講嘅就喺如何去應用HTTP POST嚟做一個用户登入驗証功能但又唔要用WebServices技術(如下圖)。


何為HTTP POST?又有何用武之地?


呢個方案喺利用Wininet.dll嘅互聨網API函式;而我只需一下幾個API就能達到用户登入驗証功能嘞。

InternetOpen
InternetConnect
HttpOpenRequest
HttpAddRequestHeaders
HttpSendRequest
HttpQueryInfo
InternetQueryDataAvailable
InternetReadFile
InternetCloseHandle


如要知以一上每一個API函式嘅詳细解釋,請参閱MSDN Library為凖。

此實驗分咗两個部分:
1. ASP script用于驗証呈報數据。
2. Win32 VC++程式,用于呈報數据(HTTP POST)到伺服器.


因為個ASP script喺非常简單甚至一睇就明嗰只,所以我亦唔會多解釋。 
 

何為HTTP POST?又有何用武之地?<%@ Language=VBScript CODEPAGE=65001%>
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
<%
何為HTTP POST?又有何用武之地?  
dim userid
何為HTTP POST?又有何用武之地?  
dim password
何為HTTP POST?又有何用武之地?  
dim result
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?  
'// GET THE CURRENT POSTED DATA
何為HTTP POST?又有何用武之地?
  userid = request.form("userid")
何為HTTP POST?又有何用武之地?  password 
= request.form("password")
何為HTTP POST?又有何用武之地? 
何為HTTP POST?又有何用武之地?  
'// VERIFY THE USERID & PASSWORD
何為HTTP POST?又有何用武之地?
  if strcomp(userid, "admin"0<> 0 then
何為HTTP POST?又有何用武之地?    result 
= "Invalid user id!"
何為HTTP POST?又有何用武之地?
  elseif strcomp(password, "p@ssw0rd"0<> 0 then
何為HTTP POST?又有何用武之地?    result 
= "Invalid password!"
何為HTTP POST?又有何用武之地?
  else
何為HTTP POST?又有何用武之地?    result 
= "logon successful!"
何為HTTP POST?又有何用武之地?
  end if
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?  
'// WRITE THE RESULT
何為HTTP POST?又有何用武之地?
  Response.Write result
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?  
'// STOP ALL RESPONSE
何為HTTP POST?又有何用武之地?
  Response.End
何為HTTP POST?又有何用武之地?%
>

 
至于個VC++源代碼就要慝别强調三項:

其一:InternetConnect嘅第二引數就喺個伺服器端IP或多或少URL;當你用此源代碼时就要加倍小心。切記必定要改(如果你嘅伺服器唔喺安装于同開發平台同一部電脑,127.0.0.1也就喺代表localhost)。

其二:HttpOpenRequest嘅第三引數就喺個驗証呈報數据asp script網址。此項也要小心;當你個logon.asp唔係喺eval嘅virtual directory喥;咁就將次换去你設定嘅path嘞。

其三:HttpSendRequest嘅第四引數就喺你所POST嘅資料;亦即喺userid同password。此一定要同asp script里面所冩同一宣告名稱。一旦代諕出錯。。。咁個呈報數据就無法收到嘞。仲有,個POST資料一定要跟以下格式。

useridadmin&password=p@ssw0rd


userid同password喺宣告名稱,而admin同p@ssw0rd就喺個宣告名稱值數。由第二個宣告名稱就要加一個&符諕嚟分開每一個宣告名稱同前一個宣告名稱嘅值數。


當個asp script程式操作完後就會轉回值數;而個Win32 VC++程式就會分析個轉回值數而斷定登入驗証成功或失敗嘞。

實驗源代碼下載: /Files/hackzai/source/vc//httppost_code.zip

 

何為HTTP POST?又有何用武之地?long PostToRemoteServer (LPBYTE pMessage, LPHTTPINFO lphi, LPBYTE pOutput, int nMaxBuffer)
{
;
何為HTTP POST?又有何用武之地?    LPBYTE            lpData            
= NULL;
何為HTTP POST?又有何用武之地?    
何為HTTP POST?又有何用武之地?    DWORD            dwSize            
= 0;
何為HTTP POST?又有何用武之地?    DWORD            dwRet            
= 0;
何為HTTP POST?又有何用武之地?    DWORD            dwByteRead        
= 0;
何為HTTP POST?又有何用武之地?    DWORD            dwContentLen    
= 0;
何為HTTP POST?又有何用武之地?    DWORD            dwByteAvailable 
= 0;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?    HINTERNET        hSession        
= NULL;
何為HTTP POST?又有何用武之地?    HINTERNET        hConnection        
= NULL;
何為HTTP POST?又有何用武之地?    HINTERNET        hOpenRequest    
= NULL;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?    
char            szHeader[]        = "Content-Type: application/x-www-form-urlencoded\r\n";
何為HTTP POST?又有何用武之地?    
long            lResult            = 0;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?    __try
{
何為HTTP POST?又有何用武之地?        
// Ensure the pass in arguement is valid



何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?        
// Open a new instance of the Internet Access
何為HTTP POST?又有何用武之地?
        hSession = InternetOpen("CIBS",
何為HTTP POST?又有何用武之地?                                INTERNET_OPEN_TYPE_PRECONFIG,
何為HTTP POST?又有何用武之地?                                NULL,
何為HTTP POST?又有何用武之地?                                NULL,
何為HTTP POST?又有何用武之地?                                
0);
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?        
// Checking the Internet session handle
何為HTTP POST?又有何用武之地?
        if (NULL != hSession)
{
何為HTTP POST?又有何用武之地?            
// Connect to the specified server (IP)
何為HTTP POST?又有何用武之地?
            hConnection = InternetConnect(hSession,
何為HTTP POST?又有何用武之地?                                          CibsInfo.Server,
何為HTTP POST?又有何用武之地?                                          INTERNET_DEFAULT_HTTP_PORT,
何為HTTP POST?又有何用武之地?                                          NULL,
何為HTTP POST?又有何用武之地?                                          
"HTTP/1.1",
何為HTTP POST?又有何用武之地?                                          INTERNET_SERVICE_HTTP,
何為HTTP POST?又有何用武之地?                                          
0,
何為HTTP POST?又有何用武之地?                                          
0);
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?            
// Check the Internet connect handle value
何為HTTP POST?又有何用武之地?
            if (NULL != hConnection)
{
何為HTTP POST?又有何用武之地?                
// Open a request to the current server
何為HTTP POST?又有何用武之地?
                hOpenRequest = HttpOpenRequest(hConnection,
何為HTTP POST?又有何用武之地?                                               
"POST",
何為HTTP POST?又有何用武之地?                                               CibsInfo.WebApp,
何為HTTP POST?又有何用武之地?                                               
"HTTP/1.1",
何為HTTP POST?又有何用武之地?                                               NULL,
何為HTTP POST?又有何用武之地?                                               
0,
何為HTTP POST?又有何用武之地?                                               INTERNET_FLAG_RELOAD,
何為HTTP POST?又有何用武之地?                                               
0);
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?        
何為HTTP POST?又有何用武之地?                
// Check the OpenRequest handle value
何為HTTP POST?又有何用武之地?
                if (NULL != hOpenRequest)
{
何為HTTP POST?又有何用武之地?                    
// Add the following header type
何為HTTP POST?又有何用武之地?                    
//        Content-Type: application/x-www-form-urlencoded
何為HTTP POST?又有何用武之地?
                    if (TRUE == HttpAddRequestHeaders (hOpenRequest,
何為HTTP POST?又有何用武之地?                                                       szHeader,
何為HTTP POST?又有何用武之地?                                                       strlen(szHeader),
何為HTTP POST?又有何用武之地?                                                       HTTP_ADDREQ_FLAG_REPLACE 
| HTTP_ADDREQ_FLAG_ADD))
{
何為HTTP POST?又有何用武之地?                        
// Post the message to server via "POST" method
何為HTTP POST?又有何用武之地?
                        if (TRUE == HttpSendRequest (hOpenRequest,
何為HTTP POST?又有何用武之地?                                                     NULL,
何為HTTP POST?又有何用武之地?                                                     
0,
何為HTTP POST?又有何用武之地?                                                     (LPSTR)pMessage,
何為HTTP POST?又有何用武之地?                                                     strlen((LPSTR)pMessage)))
{
何為HTTP POST?又有何用武之地?                            
// Get all the HTTP information
何為HTTP POST?又有何用武之地?
                            dwSize = sizeof(HttpInfo.ContentType);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_CONTENT_TYPE,    
&HttpInfo.ContentType,        &dwSize, 0); 
何為HTTP POST?又有何用武之地?                            dwSize 
= sizeof(HttpInfo.ContentLength);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_CONTENT_LENGTH,    
&HttpInfo.ContentLength,    &dwSize, 0); 
何為HTTP POST?又有何用武之地?                            dwSize 
= sizeof(HttpInfo.LastModified);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_LAST_MODIFIED,    
&HttpInfo.LastModified,        &dwSize, 0);   
何為HTTP POST?又有何用武之地?                            dwSize 
= sizeof(HttpInfo.Server);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_SERVER,            
&HttpInfo.Server,            &dwSize, 0);   
何為HTTP POST?又有何用武之地?                            dwSize 
= sizeof(HttpInfo.StatusCode);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_STATUS_CODE,        
&HttpInfo.StatusCode,        &dwSize, 0);  
何為HTTP POST?又有何用武之地?                            dwSize 
= sizeof(HttpInfo.StatusText);
何為HTTP POST?又有何用武之地?                            HttpQueryInfo(hOpenRequest, HTTP_QUERY_STATUS_TEXT,        
&HttpInfo.StatusText,        &dwSize, 0);   
何為HTTP POST?又有何用武之地?                            
// Copy the current data into the output buffer
何為HTTP POST?又有何用武之地?
                            CopyMemory(lphi, &HttpInfo, sizeof(HTTPINFO));
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?                            
// Reset local variable
何為HTTP POST?又有何用武之地?
                            dwContentLen = 0;
何為HTTP POST?又有何用武之地?                            
// Reset pass in output buffer
何為HTTP POST?又有何用武之地?
                            memset(pOutput, NULL, nMaxBuffer);
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?                            
// Continue Query the available data till the EOF
何為HTTP POST?又有何用武之地?                            
// Where the InternetQueryDataAvailable return FALSE
何為HTTP POST?又有何用武之地?
                            while (InternetQueryDataAvailable(hOpenRequest,
何為HTTP POST?又有何用武之地?                                                              
&dwByteAvailable,
何為HTTP POST?又有何用武之地?                                                              
0,
何為HTTP POST?又有何用武之地?                                                              
0))
{
何為HTTP POST?又有何用武之地?                                
// Check the current data available download size
何為HTTP POST?又有何用武之地?
                                if (dwByteAvailable > 0)
{
何為HTTP POST?又有何用武之地?                                    
// Accumulate the data length
何為HTTP POST?又有何用武之地?
                                    dwContentLen += dwByteAvailable;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?                                    
// Allocate Memory
何為HTTP POST?又有何用武之地?
                                    lpData = (LPBYTE)LocalAlloc(LPTR, dwByteAvailable+1);
何為HTTP POST?又有何用武之地?                                    
// Read File
何為HTTP POST?又有何用武之地?
                                    dwRet = InternetReadFile(hOpenRequest, lpData, dwByteAvailable, &dwByteRead);
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?                                    
// Check current downloaded data agaist pass in buffer size
何為HTTP POST?又有何用武之地?
                                    if (((long)strlen((LPSTR)pOutput) + (long)dwByteAvailable) < nMaxBuffer)
{
何為HTTP POST?又有何用武之地?                                        
// Append the current data into the pass in output buffer
何為HTTP POST?又有何用武之地?
                                        strncat((LPSTR)pOutput, (LPSTR)lpData, dwByteAvailable);
何為HTTP POST?又有何用武之地?                                    }

何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?                                    
// Release the allocate memory

何為HTTP POST?又有何用武之地?                                    lpData 
= NULL;
何為HTTP POST?又有何用武之地?                                }

何為HTTP POST?又有何用武之地?                                
else
{
何為HTTP POST?又有何用武之地?                                    
// Set Return Value
何為HTTP POST?又有何用武之地?
                                    lResult = (long)dwContentLen;
何為HTTP POST?又有何用武之地?                                    
// Exit the current While何為HTTP POST?又有何用武之地?Wend何為HTTP POST?又有何用武之地? loop
何為HTTP POST?又有何用武之地?
                                    break;
何為HTTP POST?又有何用武之地?                                }

何為HTTP POST?又有何用武之地?                            }

何為HTTP POST?又有何用武之地?                        }

何為HTTP POST?又有何用武之地?                        
else
何為HTTP POST?又有何用武之地?                            
// Set Return Value
何為HTTP POST?又有何用武之地?
                            lResult = -6;
何為HTTP POST?又有何用武之地?                    }

何為HTTP POST?又有何用武之地?                    
else
何為HTTP POST?又有何用武之地?                        
// Set Return Value
何為HTTP POST?又有何用武之地?
                        lResult = -5;
何為HTTP POST?又有何用武之地?                }

何為HTTP POST?又有何用武之地?                
else
何為HTTP POST?又有何用武之地?                    
// Set Return Value
何為HTTP POST?又有何用武之地?
                    lResult = -4;
何為HTTP POST?又有何用武之地?            }

何為HTTP POST?又有何用武之地?            
else
何為HTTP POST?又有何用武之地?                
// Set Return Value
何為HTTP POST?又有何用武之地?
                lResult = -3;
何為HTTP POST?又有何用武之地?        }

何為HTTP POST?又有何用武之地?        
else
何為HTTP POST?又有何用武之地?            
// Set Return Value
何為HTTP POST?又有何用武之地?
            lResult = -2;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?        
// Jump top CleanExit section
何為HTTP POST?又有何用武之地?
        goto CleanExit;
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?    }

何為HTTP POST?又有何用武之地?    __except(EXCEPTION_EXECUTE_HANDLER)
{
何為HTTP POST?又有何用武之地?        
// PUT YOUR ERROR HANDLE CODE HERE
何為HTTP POST?又有何用武之地?        
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?        
// Set the return value
何為HTTP POST?又有何用武之地?
        lResult = -1;
何為HTTP POST?又有何用武之地?    }

何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?CleanExit:
何為HTTP POST?又有何用武之地?    
// Close all the used handle



何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?
何為HTTP POST?又有何用武之地?    
// Set default return value
何為HTTP POST?又有何用武之地?
    return lResult;
何為HTTP POST?又有何用武之地?}

相关文章:

  • 2022-12-23
  • 2021-10-02
  • 2021-09-25
  • 2021-07-28
  • 2021-06-29
  • 2022-12-23
  • 2021-07-28
  • 2021-09-19
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-07-22
  • 2022-01-15
  • 2022-12-23
  • 2021-04-20
  • 2021-09-11
相关资源
相似解决方案