Page 1 of 1

WebService - Envio Documento - Ayuda

Posted: Mon Jan 21, 2019 6:45 pm
by Fonsi5
Hola,
Llevo bastantes horas atascado con esto, estoy intentando mandar información contra un APIREST con libcurl, el problema que estoy encontrado es que necesito mandarle un fichero pdf como parte de los datos del POST.
Mediante curl con línea de comandos si soy capaz de realizar la comunicación con la siguiente llamada:

Code: Select all

curl
-X POST
-H 'Authorization: Bearer ACCESS_TOKEN'
-F 'recipients[0][name]=Nombre' 
-F 'recipients[0][email]=correo@correo.com'
-F 'files[0]=@MYPDF.pdf'
-F 'subject=Asunto'
-F 'body=Contenido body'
URL_DESTINO
 
Revisando el log del envió, veo que manda un multipart incluyendo el contenido binario del pdf.
Pero al intentar realizarlo mediante libcurl no soy capaz de que envié el fichero, mi código actual de prueba:

Code: Select all


   curl := curl_easy_init()

   fields := "subject=Asunto&body=Cuerpo&recipients[0][name]=Nombre&recipients[0][email]=correo@correo.com&files[0]=@mipdf.pdf"
  
   aheader :={"Authorization: Bearer MI_TOKEN"}

   curl_easy_setopt( curl, HB_CURLOPT_URL, "URL_DESTINO") 
   curl_easy_setopt( curl,  HB_CURLOPT_POST,1)
   curl_easy_setopt(curl,HB_CURLOPT_HTTPHEADER,aheader)
   curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDS, fields )
   curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, .f. )
   curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYHOST, .f. )
   curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP )

   curl_easy_setopt( curl, HB_CURLOPT_VERBOSE, .T. )

   ? curl_easy_perform( curl )
   ? tmp :=  curl_easy_dl_buff_get( curl )

   curl_easy_reset( curl )
   curl_global_cleanup()

 
Al enviar esto me realiza correctamente el POST, pero no se realiza la subida del fichero, me llega “@mipdf.pdf” como texto de la clave files[0].

Si en el header indico “Content-Type: multipart/form-data” la api directamente no me recoge ninguno de _ enviados.

He intentado también indicar el content type separando por ; en el string: …&files[0]=@mipdf.pdf;type=application/pdf, pero recibo también la cadena de texto.

En principio curl debería reconocer el @ y tratar mipdf.pdf como un fichero, no como texto.

He visto en la documentación de libcurl que exite la función curl_formadd() para el envío de formularios, pero no he sido capaz de usarla, al compilar no se reconoce.

https://curl.haxx.se/libcurl/c/curl_formadd.html

También he estado realizando pruebas mediante Microsoft.XMLHTTP, con el mismo resultado, he sido capaz de enviar correctamente todos los datos con un json, pero el pdf no he sido capaz, tras leer documentación creo que por este método no es posible el envío de datos.

No se si habeis tenido que realizar alguna vez este tipo de envio y podeis echarme una mano, ya no se por donde seguir probando.

Muchas gracias!!

Re: WebService - Envio Documento - Ayuda

Posted: Tue Jan 22, 2019 8:35 am
by Joaquim Ferrer
Viktor Vszakats en su fork de harbour dispone de un ejemplo de envio de email por curl
https://github.com/vszakats/harbour-cor ... /email.prg

Fíjate en el apartado en que envia un fichero adjunto, ahí puede estar la clave de todo

Code: Select all

curl_easy_setopt( curl, HB_CURLOPT_MIMEPOST, { ;
            { "subparts" => { ;
              { "data" => cHTML, ;
                "type" => "text/html" }, ;
              { "data" => cText } }, ;
              "type" => "multipart/alternative", ;
              "headers" => { "Content-Disposition: inline" } }, ;
            { "filedata" => __FILE__ }, ;
            { "data" => Replicate( hb_BChar( 123 ), 1024 ), ;
              "type" => "image/png", ;
              "encoder" => "base64", ;  /* binary, 8bit, 7bit, base64, quoted-printable */
              "filename" => "mock.png" } } )
 
No lo he probado pero podría ser un inicio para estudio
Saludos