Cómo duplicar el comando de línea de curl con libcurl de Visual C++
He estado usando libcurl en mis programas de Visual C++ por un tiempo. Estoy tratando de escribir un nuevo programa que duplique esta línea de comando:
curl -d 'assetclass=1&viewall=1&action=Go' https://stockmarketmba.com/stockscreener.php
Esta es la primera vez que tengo que ‘hacer clic’ en botones para obtener los datos que quiero. Este es mi código, sin el código que verifica los retornos de las llamadas curl_easy_setopt():
static size_t WriteCallBack( void *contents, size_t size, size_t nmemb, void *userp ) noexcept {
size_t nbytes( size * nmemb );
((std::string*)userp)->append( (char*)contents, nbytes );
return nbytes;
}
ReadWebData() {
CURLcode res;
string bufr;
CURL *handle = curl_easy_init();
curl_easy_setopt( handle, CURLOPT_URL, "https://stockmarketmba.com/stockscreener.php" );
char const *postfields = { "assetclass=1&viewall=1&action=Go" };
curl_easy_setopt( handle, CURLOPT_POSTFIELDS, postfields );
curl_easy_setopt( handle, CURLOPT_POSTFIELDSIZE, (long)strlen( postfields ) );
curl_easy_setopt( this->handle, CURLOPT_WRITEFUNCTION, WriteCallBack );
curl_easy_setopt( this->handle, CURLOPT_WRITEDATA, &bufr )
res = curl_easy_perform( handle );
if ( res == CURLE_OK ) {
// process data in bufr here
}
}
Cuando miro en bufr
, contiene los mismos datos que obtuve antes de agregar las llamadas curl_easy_setopt()
con CURLOPT_POSTFIELDS
y CURLOPT_POSTFIELDSIZE
. Agregué llamadas curl_easy_setopt()
con CURLOPT_DEBUGFUNCTION
, CURLOPT_DEBUGDATA
y CURLOPT_VERBOSE
, y no veo dónde se envían los campos de envío al servidor.
¿Qué me falta?
davy.ai
Parece que te falta incluir la opción
CURLOPT_POST
en tus llamadas acurl_easy_setopt()
. Sin ella, libcurl enviará una solicitud GET en vez de una solicitud POST, lo que explica por qué no estás viendo que los campos de post se envíen al servidor en la salida de depuración.Para solucionar esto, agrega la siguiente línea de código después de establecer los postfields:
Esto debería enviar una solicitud POST con los postfields especificados al servidor, y deberías verlos en la respuesta del servidor.