es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que te falta incluir la opción CURLOPT_POST en tus llamadas a curl_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:

    curl_easy_setopt( handle, CURLOPT_POST, 1L );
    

    Esto debería enviar una solicitud POST con los postfields especificados al servidor, y deberías verlos en la respuesta del servidor.

Comments are closed.