想不通您为什么不用NMHTTP的POST方式而去调用API?

解决方案 »

  1.   

    顺序:
    InternetOpen(...)
    InternetConnect(...)
    InternetSetStatusCallback(...)
    HttpOpenRequest(...)
    HttpAddRequestHeaders(...)
    HttpSendRequest(...)
    HttpQueryInfo(...)
    InternetReadFile(...)
    我想是不是您在Ce下开发程序或是您自己想做一个上传下载的工具?因为在VC,Delphi中都有控件来简化操作的,我建议还是用MFC的吧,用到CInternetSession,CHttpFile等,简单多了。
      

  2.   

    NMhttp 的Post,或者...自己用 TClientSocket 也一样的搞定呀!
      

  3.   

    直接使用http协议啊!
    象我自己做了一个在我的家乡的BBS刷屏的机器……
    这样做:
    先定义:
    char MyStr[65535]="POST /cgi-bin/xybook/bbs.cgi HTTP/1.1\x0d\x0a"
    "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\x0d\x0a"
    "Referer: 127.0.0.1\x0d\x0a"
    "Accept-Language: zh-cn\x0d\x0a"
    "Content-Type: application/x-www-form-urlencoded\x0d\x0a"
    "Accept-Encoding: gzip, deflate\x0d\x0a"
    "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)\x0d\x0a"
    "Host: www.xy.gz.cn\x0d\x0a"
    "Content-Length: 255\x0d\x0a"
    "Connection: Keep-Alive\x0d\x0a";char strBuffer[9000];
    //////////////////////////////////////////然后:AddStr = ("PUT http://202.98.201.244/cgi-bin/xybook/bbs.cgi?menu=addtitle&id=" +
                    Id + "&username=" + UserName.c_str() + "&userpsd=" + UserPsd.c_str()
                    + "&mail=" + Mail.c_str() + "&home=" + Home.c_str() + "&emote=" + Emote.c_str()
                    + "&titles=" + TitleEdit->Text.c_str() + "&comment=" + tempStr.c_str() + "\r\n");//cgi程序的提交形式                strcpy(MyStr,AddStr.c_str());                SendMyMessage();//这个函数见下:
    bool __fastcall TMainForm::SendMyMessage(void)
    {
            WSADATA ws;
            SOCKET s;
            struct sockaddr_in addr;
            int iResult;
            long lResult;
            flag = true;
            lResult = WSAStartup(0x0101,&ws);
            s = socket(AF_INET,SOCK_STREAM,0);
            addr.sin_family = AF_INET;
            addr.sin_port = htons(80);
            addr.sin_addr.s_addr = inet_addr ("202.98.201.244");
            iResult=connect(s,(struct sockaddr *) &addr, sizeof(addr));
            if(SOCKET_ERROR == iResult){// 连接失败
                    WSACleanup();
                    ShowMessage("连接服务器失败!!!\n请检查网络是否畅通!");
                    return false;
            }else{// 连接成功
                    iResult = send(s,MyStr,sizeof(MyStr),0);
            do
            {
                    strset(strBuffer,' ');
                    iResult = recv(s,strBuffer,sizeof(strBuffer),0);
                    if(flag == true){
                            if(AnsiPos("<META HTTP-EQUIV=Refresh", AnsiString(strBuffer))<=0){
                                    ShowMessage("错误!发送失败!\n请检查你的配置!\n比如密码和用户名等!");
                                    Timer->Enabled = false;
                            }
                    flag = false;
                    }
                    Application->ProcessMessages();
            }
            while( iResult !=0 );
    }
            WSACleanup();
            return true;
    }当然,这之前你要对你提交的被容先行处理:
    AnsiString tempStr = ComMemo->Text;                tempStr = StringReplace(tempStr,'\%',"%25",rf);
                    tempStr = StringReplace(tempStr,'\=',"%3d",rf);
                    tempStr = StringReplace(tempStr,'\&',"%26",rf);
                    tempStr = StringReplace(tempStr,'\\',"%5c",rf);
                    tempStr = StringReplace(tempStr,'\/',"%2f",rf);
                    tempStr = StringReplace(tempStr,'\?',"?",rf);
                    tempStr = StringReplace(tempStr,'\r',"%0a",rf);
                    tempStr = StringReplace(tempStr,'\n',"%0d",rf);
                    tempStr = StringReplace(tempStr,'\ ',"%20",rf);
                    tempStr = StringReplace(tempStr,'\<',"%3c",rf);
                    tempStr = StringReplace(tempStr,'\>',"%3e",rf);
                    tempStr = StringReplace(tempStr,'\#',"%23",rf);
                    tempStr = StringReplace(tempStr,'\$',"%24",rf);
    等等! 
      

  4.   

    rh同志,能不能直接把该程序源代码发给我,研究一下,不胜感激!
    我的EMAIL:[email protected]