Данные формы POST с использованием WinInet c ++ - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь подключить эту программу к веб-сайту и отправить данные формы для входа в систему, но я не знаю, что я делаю неправильно. Я слышал о других, таких как curl и Winsock, но я выбрал библиотеку WinINet. Так что просто для тестирования этой программы я использовал сайт Pastebin для публикации. До сих пор я не видел никаких результатов от этого. Если этой программе удастся опубликовать данные формы, она даст мне заголовок местоположения сообщения на их сайте.

Правильно ли я пишу данные формы char *? Я видел на других постах stackoverflow, где у них было большое количество тире до некоторого числа, после чего они помещали свои данные формы.

Нужно ли что-то добавить к нему, чтобы оно имитировало нажатие кнопки отправки?
Нужно ли выписывать значения для каждого элемента в форме?

Я пробовал HttpAddRequestHeaders, и это мне не помогло.

Кроме того, я получаю ошибку ERROR_INSUFFICIENT_BUFFER в HttpOpenRequest, но он по-прежнему возвращает действительный 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;
}

1 Ответ

0 голосов
/ 16 ноября 2011

Ваш код почти правильный, вы должны убедиться в следующих пунктах:

  1. char* hdrs="Content-Type: application/x-www-form-urlencoded"; вы должны убедиться, что ваш возвращаемый объект из сообщения POST будет иметь тип x-www-form-urlencoded или JSON.если это JSON, вам нужно определить char* hdrs="Content-Type: application/json\r\n"; Примечание: вы должны добавить \r\n к hdrs.

  2. попытаться вызвать метод readFile, например, с буфером размером 10000 и буфером печати,будет напечатан вывод ответа на соединение

  3. В HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST","/", NULL, NULL, accept, 0, 0); вместо "/" необходимо вызвать путь запрошенного API, например:.
    In HINTERNET hRequest2 = HttpOpenRequest(hConnect, "POST", "/users/jsonlogin", NULL, NULL, accept, 0, 0);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...