使用WinInet c ++ POST表单数据

问题描述 投票:1回答:1

我正在尝试将此程序连接到一个网站并提交表单数据以便登录,但我不知道我做错了什么。我听说过像curl和Winsock这样的人,但我选择了WinINet库。所以只是为了测试这个程序,我一直在使用Pastebin网站发布。到目前为止,我还没有看到任何结果。如果此程序成功发布表单数据,它将向我提供其站点上帖子位置的标题。

我正确地写了表格数据char *吗?我已经在其他stackoverflow帖子上看到过,他们在一些数字之前有大量的破折号然后放置他们的表单数据。

我是否需要添加内容才能模拟单击提交按钮? 我是否需要为表单上的每个元素写出值?

我试过HttpAddRequestHeaders,这对我没有帮助。

另外,我在HttpOpenRequest上收到ERROR_INSUFFICIENT_BUFFER错误,但它仍然返回一个有效的HINTERNET。

#include <Windows.h>
#include <WinInet.h>
#include <iostream>

#pragma comment( lib,"Wininet.lib")
using namespace std;

char* getheaders(HINTERNET hRequest){
    DWORD dwInfoLevel=HTTP_QUERY_RAW_HEADERS_CRLF;
    DWORD dwInfoBufferLength=10;
    char* pInfoBuffer=(char*)malloc(dwInfoBufferLength+1);
    while(!HttpQueryInfo(hRequest,dwInfoLevel,pInfoBuffer,&dwInfoBufferLength,NULL)){
        if (GetLastError()==ERROR_INSUFFICIENT_BUFFER){
            free(pInfoBuffer);
            pInfoBuffer=(char*)malloc(dwInfoBufferLength+1);
        }else{
            fprintf(stderr,"HttpQueryInfo failed, error = %d (0x%x)\n",GetLastError(),GetLastError());
            break;
        }
    }
    pInfoBuffer[dwInfoBufferLength] = '\0';
    return pInfoBuffer;
}

void readfile(HINTERNET hRequest,char** buffs,int size){
    DWORD dwBytesAvailable;
    DWORD dwBytesRead;
    for(int i=0;i<size;i++){
        if(!InternetQueryDataAvailable(hRequest,&dwBytesAvailable,0,0)) break;
        buffs[i]=(char*)malloc(dwBytesAvailable+1);
        bool bResult=InternetReadFile(hRequest,buffs[i],dwBytesAvailable,&dwBytesRead);
        if(!bResult | dwBytesRead==0) break;
    }
}


int main(int argc,char** argv){
    char* hdrs="Content-Type: application/x-www-form-urlencoded";
    char* frmdata="paste_code=test";
    LPCSTR accept[2]={"*/*", NULL};

    HINTERNET hSession = InternetOpen("http generic",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnect = InternetConnect(hSession, "www.pastebin.com",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = HttpOpenRequest(hConnect, "GET","/", NULL, NULL, accept, 0, 0);
    //ERROR_INSUFFICIENT_BUFFER (122) with "accept".

    bool send=HttpSendRequest(hRequest, hdrs, strlen(hdrs), NULL,NULL);
    if(!send){
        printf("HttpSendRequest failed, code=%d",GetLastError());
        system("pause>nul");
        return 0;
    }

    char* heads=getheaders(hRequest);
    printf("%s\n\n\n\n",heads);

    HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST","/", NULL, NULL, accept, 0, 0);
    //ERROR_INSUFFICIENT_BUFFER (122) with "accept".

    send=HttpSendRequest(hRequest2, hdrs, strlen(hdrs), frmdata,strlen(frmdata));
    if(!send){
        printf("HttpSendRequest failed, code=%d",GetLastError());
        system("pause>nul");
        return 0;
    }

    heads=getheaders(hRequest);
    printf("%s\n\n\n\n",heads);

    InternetCloseHandle(hRequest);
    InternetCloseHandle(hRequest2);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);

    system("pause>nul");
    return 0;
}
c++ visual-studio forms wininet
1个回答
0
投票

您的代码几乎是正确的,您必须确保以下几点:

  1. char* hdrs="Content-Type: application/x-www-form-urlencoded";你必须确保POST消息中的返回对象是x-www-form-urlencodedJSON类型。如果它是JSON你需要定义char* hdrs="Content-Type: application/json\r\n";注意:你必须将\r\n附加到hdrs。
  2. 尝试使用大小为10000的缓冲区调用readFile方法和打印缓冲区,它会将响应的输出打印到连接
  3. HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST","/", NULL, NULL, accept, 0, 0);而不是“/”中,您必须调用所请求的API的路径,例如:。 在HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST", "/users/jsonlogin", NULL, NULL, accept, 0, 0);
© www.soinside.com 2019 - 2024. All rights reserved.