如何在vc中实现模拟一个web页面中form提交。

解决方案 »

  1.   

    MFC的:
    void post()
    {
        CInternetSession session("My Session");
        CHttpConnection* pServer = NULL;
        CHttpFile* pFile = NULL;
        CString ServerName = "webmail.21cn.com";
        INTERNET_PORT nPort = 80;
        DWORD retcode;
        char outBuff[300] = "LoginName=aaa&passwd=xxx&DomainName=21cn.com";//I have test this with my loginname and password
        try
        {
            pServer = session.GetHttpConnection(ServerName,nPort);
            pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/NULL/NULL/NULL/NULL/NULL/SignIn.gen",NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);
            pFile -> AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");
            pFile -> AddRequestHeaders("Accept: */*");
            pFile -> SendRequest(NULL,0,outBuff,strlen(outBuff)+1);
            pFile -> QueryInfoStatusCode(retcode);
            // you can read from the file after this......I've just left it out.
            for(int i=0;i<10;i++)//read ten line of returned HTML,you need to edit this to use the result
            {
            CString smsg;
            pFile->ReadString(smsg);
            AfxMessageBox(smsg);
            }
    DWORD dwlen=pFile->GetLength();
    char buf[1024];
    DWORD dwread=pFile->Read(buf,1024);
        }
        catch (CInternetException * e){};
        delete pFile;
        delete pServer;
        session.Close();
    }
      

  2.   

    socket的:
    ///////////////////////////////////////////////////////////////////////////
    //SDK post
    ///////////////////////////////////////////////////////////////////////////
    #include "stdafx.h"
    #include "winsock.h"
    #pragma comment(lib,"ws2_32.lib")
    #define winsock_version 0x0101
    void main()
    {
    //I create  C:\Inetpub\wwwroot\test\test.asp ,start the web service
    //start my program, the result is OK.
    //If it works,it is written by masterz,otherwise I don't know who write it.
        SOCKADDR_IN saServer;
    LPHOSTENT lphostent;
    WSADATA wsadata;
        SOCKET hsocket;
    int nRet;
    const char* host_name="127.0.0.1";
    char* req="POST /test/test.asp HTTP/1.0\r\n"
    "From: local\r\n"
    "User-Agent: post_test/1.0\r\n"
    "Content-Type: application/x-www-form-urlencoded\r\n"
    "Content-Length: 20\r\n\r\n"
    "type=12345&name=aaaa";
    if(WSAStartup(winsock_version,&wsadata))
    printf("can't initial socket");
        lphostent=gethostbyname(host_name);
        if(lphostent==NULL)
    printf("lphostent is null");
    hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        saServer.sin_family = AF_INET;
    // Use def. now, need to handle general case
    saServer.sin_port = htons(80);
    saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);
        nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
    if (nRet == SOCKET_ERROR)
    {
    printf("can't connect");
    closesocket(hsocket);
    return;
    }
    else
    printf("connected with %s\n",host_name);
    nRet = send(hsocket, req, strlen(req), 0);
    if (nRet == SOCKET_ERROR)
    {
    printf("send() failed");
    closesocket(hsocket);

    }
    else
    printf("send() OK\n");
    char dest[1000];
    nRet=1;
    while(nRet>0)
    {
    nRet=recv(hsocket,(LPSTR)dest,sizeof(dest),0);
    if(nRet>0)
    dest[nRet]=0;
    else
    dest[0]=0;
    printf("\nReceived bytes:%d\n",nRet);
    printf("Result:\n%s",dest);
    }
    }
      

  3.   

    WinInet APIstatic TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
    static TCHAR frmdata[] = _T("name=John+Doe&userid=hithere&other=P%26Q"); 
    static TCHAR accept[] = _T("Accept: */*"); 
    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));
      

  4.   

    brainholmes(我是大头蒜) 的回答真全面,佩服!
      

  5.   

    如果是GET方式,可以更简单
    std::stringstream ss;
    ss<<"http://127.0.0.1/xp_call_asp_by_onega.asp?table_name="<<szTable<<"&record_id="
    <<record_id<<"&additional_info="
    <<szAdditionalInfo;
    LPCTSTR download_file_name = "c:\\xp_call_asp_by_onega.htm";
    DeleteFile(download_file_name);
    URLDownloadToFile(NULL,ss.str().c_str(),download_file_name,0,NULL);