天天看点

C++ POST方式访问网页

用C++打开网页时,有两种方式,一种是get方式,另一种为post方式。get方式为一般常用的方式,我们在地址栏中键入网址打开网站就属于get方式。而post方式则比较麻烦,如下函数实现了用post方式访问网页。

bool PostContent(CString strUrl, const CString &strPara, CString &strContent, CString &strDescript)//第一个参数为URL头

{                         //第二个参数为要post表单的内容

    try{                       //第三个参数用于保存页面返回的信息

                         //第四个参数用于记录日志

        strDescript = "提交成功完成!";

        bool bRet = false;

        CString strServer, strObject, strHeader, strRet;

        unsigned short nPort;

        DWORD dwServiceType;

        if(!AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort))

        {

            strDescript = strUrl + "不是有效有网络地址!";

            return false;

        }

        CInternetSession sess;//Create session

        CHttpFile* pFile;

        //

        CHttpConnection *pServer = sess.GetHttpConnection(strServer, nPort);

        if(pServer == NULL)

        {

            strDescript = "对不起,连接服务器失败!";

            return false;

        }

        pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject,NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);

        if(pFile == NULL)

        {

            strDescript = "找不到网络地址" + strUrl;

            return false;

        }

        pFile -> AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");

        pFile -> AddRequestHeaders("Accept: */*");

        pFile -> SendRequest(NULL, 0, (LPTSTR)(LPCTSTR)strPara, strPara.GetLength());

        CString strSentence;

        DWORD dwStatus;

        DWORD dwBuffLen = sizeof(dwStatus);

        BOOL bSuccess = pFile->QueryInfo(

            HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,

            &dwStatus, &dwBuffLen);

        if( bSuccess && dwStatus>=  200 && dwStatus<300)

        {

            char buffer[256];

            memset(buffer, 0, 256);

            int nReadCount = 0;

            while((nReadCount = pFile->Read(buffer, 2048)) > 0)

            {

                strContent += buffer;

                memset(buffer, 0, 256);

            }

            bRet = true;

        }

        else

        {

            strDescript = "网站服务器错误" + strUrl;

            bRet = false;

        }

        pFile->Close();

        sess.Close();

        return bRet;

    }

    catch(...)

    {

        int nCode = GetLastError();

        strDescript.Format("向服务器post失败!错误号:%d", nCode);

        return false;

    }

}

以上代码摘自CSDN论坛biweilun的帖子。