向WEB伺服器GET,POST資料(C++代碼)

來源:互聯網
上載者:User

致謝:感謝CSDN的zjh824。

以下代碼在您的文章《  wince 中使用HttpSendRequest函數POST資料時應該注意的一點》的基礎上進行了修改。

http://blog.csdn.net/zjh824/archive/2007/10/26/1845580.aspx

 http://hi.baidu.com/%B3%AC%C8%BBa/blog/item/0a2a0d1f311ad7e2e1fe0b74.html

/****************************************************************************************************************************/

BOOL SendDataToServer(CString strWeb,                                //服務端頁面地址。如:www.safewe.com/job1.htm
                        CString strSendBuffer,                          //發送資料
                        LPBYTE lpRecvBuffer,                            //返回資料儲存地址
                        DWORD dwRecvDataLen,                            //返回資料長度
                        CString &strRetHeadInfo,                        //返回資料頭
                        CString strOpenRequestType = TEXT("GET"),       //資料請求類型:分為GET 和 POST兩種
                        CString strHeaders = TEXT("Accept: */*\r\nContent-Type: application/x-www-form-urlencoded"),
                                                                        //資料頭
                        DWORD dwPort = 80,                              //連接埠
                        DWORD dwServiceType = AFX_INET_SERVICE_HTTP     //服務類型
                        );

BOOL SendDataToServer(CString strWeb,                //服務端頁面地址。如:www.safewe.com/job1.htm
                      CString strSendBuffer,         //發送資料
                      LPBYTE lpRecvBuffer,           //返回資料儲存地址
                      DWORD dwRecvDataLen,           //返回資料長度
                      CString &strRetHeadInfo,       //返回資料頭
                      CString strOpenRequestType,    //資料請求類型:分為GET 和 POST兩種
                      CString strHeaders,            //資料頭
                      DWORD dwPort,                  //連接埠
                      DWORD dwServiceType            //服務類型
      )
{
    CString strServerName = strWeb;
    CString strObject = TEXT("");
    HINTERNET hOpen; 
    HINTERNET hConnect;
    HINTERNET hRequest;  
    BOOL bRet = FALSE;
    DWORD dwSize;
    TCHAR* lpHeaders = NULL;
    TCHAR szHttpStatus[4] = {0};
    int dwHttpStatus = 0;
    char *pszData = NULL;
    int nErrorCode;

    int n = strWeb.Find(TEXT("/"));
    if (n != -1)
    {
        strServerName = strWeb.Left(n);
        strObject = strWeb.Mid(n+1);
    }

    hOpen = InternetOpen(TEXT("Safewe"), INTERNET_OPEN_TYPE_DIRECT, NULL, 0, 0);
    if (!hOpen)
        return FALSE;
    
    if (!(hConnect = InternetConnect(hOpen, strServerName, dwPort,  NULL, NULL, dwServiceType, 0, 0)))
    {
        InternetCloseHandle(hOpen);
        return FALSE;
    }
    
    LPTSTR AcceptTypes[2] = {TEXT("*/*"), NULL};
    DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE;
    
    if (!(hRequest = HttpOpenRequest (hConnect, strOpenRequestType, strObject, HTTP_VERSION, NULL, 
        (LPCTSTR*)AcceptTypes, dwFlags, 0)))
    {
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hOpen);
        return FALSE;
    }
    
    DWORD dwHttpTimeout = 5000;
    if(!InternetSetOption(hRequest,INTERNET_OPTION_CONNECT_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
        goto END;
    if(!InternetSetOption(hRequest,INTERNET_OPTION_SEND_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
        goto END;
    if(!InternetSetOption(hRequest,INTERNET_OPTION_RECEIVE_TIMEOUT,&dwHttpTimeout,sizeof(DWORD)))
        goto END;
    
    //重點要注意的地方, HttpSendRequest 的第三個參數必須為多位元組編碼格式,否則伺服器端會出錯
    pszData = new char[strSendBuffer.GetLength()*2+2];
    memset(pszData,0,strSendBuffer.GetLength()*2+2);
    WideCharToMultiByte( CP_ACP, 0, strSendBuffer.GetBuffer(0),
        -1, pszData, strSendBuffer.GetLength()*2, NULL, NULL);
    
//     HttpAddRequestHeaders(hRequest, szHeaders, szHeaders.GetLength(), HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA );//資料前序這樣添加也可以
    if(HttpSendRequest(hRequest, strHeaders, strHeaders.GetLength(), pszData, strlen(pszData)) == FALSE)
    {
        nErrorCode = GetLastError();
        goto END;
    }//如果資料前序 strHeaders 為空白,會產生 ERROR_HTTP_HEADER_NOT_FOUND 錯誤
    
    HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwSize, NULL);    
    lpHeaders = new TCHAR [dwSize+1];
    ZeroMemory(lpHeaders, sizeof(lpHeaders)/sizeof(TCHAR));
    if (!HttpQueryInfo (hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID)lpHeaders, &dwSize, NULL))
        goto END2;
    
    strRetHeadInfo = lpHeaders;
    
    memcpy(szHttpStatus,lpHeaders+wcslen(_T("HTTP/1.1 ")),3*sizeof(TCHAR));
    dwHttpStatus =_wtoi(szHttpStatus);
    if ((dwHttpStatus<200) || (dwHttpStatus>300))
        goto END2;
    
    if(!InternetReadFile (hRequest, (LPVOID)(lpRecvBuffer), dwRecvDataLen, &dwSize))//這裡要接收所有資料,可改為迴圈接收
        goto END2;
    if(dwSize == 0)
        goto END2;
    
    bRet = TRUE;
END2:
    if (lpHeaders)
    {
        delete lpHeaders;
        lpHeaders= NULL;
    }
END:
    if (pszData)
    {
        delete pszData;
        pszData= NULL;
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hOpen);
    return bRet;
}

/****************************************************************************************************************************/

//函數使用樣本:

    BYTE byRecvBuff[1024] = {0};
    CString strRetHead;
    SendDataToServer(TEXT("update.safewe.com/report.php"), 
                     TEXT("string=0123456789012345test&"), byRecvBuff, 1024, strRetHead, TEXT("POST"));

/****************************************************************************************************************************/

//對應的PHP頁面代碼:

<html>
<body>

Thanks for your report!<br />

<?php
$md5 = $_POST["string"];
$file=fopen("data.txt", "a+") or $file=fopen("data.txt", "w");
fwrite($file, $string, strlen($string));
fclose($file);
?>

</body>
</html>

/****************************************************************************************************************************/

 

參考文章:

《  wince 中使用HttpSendRequest函數POST資料時應該注意的一點》

http://blog.csdn.net/zjh824/archive/2007/10/26/1845580.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.