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 puedo usar libcurl para procesar un formulario complejo?

Quiero cargar un formulario desde un archivo JSON como este:

{
  num: 1,
  falseBool: false,
  trueBool: true,
  empty: '',
  und: undefined,
  nullable: null,
  date: new Date(),
  name: 'str',
  another_object: {
    name: 'my_name',
    value: 'whatever'
  },
  array: [
    {
      key1: {
        name: 'key1'
      }
    }
  ]
};

¿Cómo debo usar la función curl_formadd de libcurl para completar esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para cargar un formulario desde un objeto JSON utilizando libcurl, puedes utilizar la función curl_formadd(). Esta función te permite agregar varios elementos de formulario a una solicitud de tipo multi-part/form-data.

    Aquí tienes un ejemplo de cómo puedes utilizar curl_formadd() para cargar el formulario JSON:

    #include <curl curl.h="">
    #include <string.h>
    
    int main(void) {
      CURL *curl;
      CURLcode res;
    
      curl_global_init(CURL_GLOBAL_ALL);
    
      curl = curl_easy_init();
    
      if(curl) {
        // Establecer la URL de tu punto final de destino
        curl_easy_setopt(curl, CURLOPT_URL, "https://your.endpoint.com/upload");
    
        // Establecer el método de solicitud a POST
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
    
        // Crear un nuevo formulario
        struct curl_httppost *formpost = NULL;
        struct curl_httppost *lastptr = NULL;
    
        // Agregar los campos del formulario
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "num",
          CURLFORM_COPYCONTENTS, "1",
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "falseBool",
          CURLFORM_COPYCONTENTS, "false",
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "trueBool",
          CURLFORM_COPYCONTENTS, "true",
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "empty",
          CURLFORM_COPYCONTENTS, "",
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "und",
          CURLFORM_COPYCONTENTS, "undefined",
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "nullable",
          CURLFORM_COPYCONTENTS, "null",
          CURLFORM_END);
        // Convertir la fecha a una cadena y agregarla al formulario
        char date_str[64];
        time_t cur_time = time(NULL);
        struct tm *tm_time = localtime(&cur_time);
        strftime(date_str, sizeof(date_str), "%Y-%m-%d %H:%M:%S", tm_time);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "date",
          CURLFORM_COPYCONTENTS, date_str,
          CURLFORM_END);
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "name",
          CURLFORM_COPYCONTENTS, "str",
          CURLFORM_END);
        // Agregar el objeto como una cadena
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "another_object",
          CURLFORM_COPYCONTENTS, "{\"name\": \"my_name\", \"value\": \"whatever\"}",
          CURLFORM_END);
        // Agregar el arreglo como una cadena
        curl_formadd(&formpost, &lastptr,
          CURLFORM_COPYNAME, "array",
          CURLFORM_COPYCONTENTS, "[{\"key1\": {\"name\": \"key1\"}}]",
          CURLFORM_END);
    
        // Establecer el formulario como los datos POST
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
    
        // Realizar la solicitud
        res = curl_easy_perform(curl);
    
        // Liberar los datos del formulario
        curl_formfree(formpost);
    
        // Verificar errores
        if(res != CURLE_OK) {
          fprintf(stderr, "curl_easy_perform() falló: %s\n",
                  curl_easy_strerror(res));
        }
    
        // Limpieza
        curl_easy_cleanup(curl);
      }
    
      curl_global_cleanup();
    
      return 0;
    }
    

    En este ejemplo, creamos un nuevo formulario utilizando struct curl_httppost y luego agregamos cada elemento del formulario JSON utilizando curl_formadd(). Para el campo date, lo convertimos a una cadena utilizando strftime(). Para los campos another_object y array, simplemente los agregamos como cadenas.

    Finalmente, establecemos el formulario como los datos POST utilizando CURLOPT_HTTPPOST y luego realizamos la solicitud con curl_easy_perform(). No olvides liberar los datos del formulario con curl_formfree() después de que la solicitud esté completa.</string.h>

Comments are closed.