Blog der Heimetli Software AG

Beispielprogramm für ein HTTP POST mit der CURL-Library

Es gibt viele Beispielprogramme für die libcurl, aber anscheinend nur wenig vernünftige. Die meisten halten sich eng ans Beispiel auf der libcurl Seite, aber das hat einige Probleme:

  • Kein vernünftiges Fehlerhandling
  • Kein URL-Encoding für die Formulardaten
  • Gibt die Antwort des Servers auf die Konsole aus
  • Schickt einen Multipart-Request an den Server

Zugegeben, die Multipart-Requests sind wohl nur mein Problem, der Server hat sie problemlos verarbeitet.

Die Fehlerbehandlung ist aber wirklich übel, denn curl_easy_perform beachtet den Response Code vom Server nicht. Eine 404-Seite vom Server wird als Erfolg gemeldet !

Ob das Beispiel die geschickten Daten selber richtig codiert oder nicht, ist weder im Beispiel noch in der Hilfe zur API zu finden. Erst ein Versuch brachte Klarheit...

Mein Programm erwartet die Daten zwar ebenfalls bereits codiert, aber wenigstens ist das klar dokumentiert.

Dass die Server-Antwort auf die Konsole geschrieben wird, konnte ich in meiner Applikation gar nicht brauchen. Die Lösung dafür musste ich mir erst zusammensuchen.

Hier ist mein Programm, die Erklärungen folgen darunter:

/******************************************************************************/
/*                                                                            */
/*                                                         FILE: CurlPost.cpp */
/*                                                                            */
/*   Demo program for libcurl                                                 */
/*   ========================                                                 */
/*                                                                            */
/*   V1.0 01-NOV-2013  Te    http://www.heimetli.ch                           */
/*                                                                            */
/******************************************************************************/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <curl/curl.h>

/********************************************************************/
 size_t Writer( void *buffer, size_t size, size_t count, void *user )
/********************************************************************/

{
   return size * count ;
}

/**********/
 int main()
/**********/

{
   // The URL-encoded data to be sent to the server
   char data[256] = "firstname=Peter&lastname=Tellenbach" ;

   curl_global_init( CURL_GLOBAL_ALL ) ;

   CURL *curl = curl_easy_init() ;

   if( curl )
   {
      curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, Writer ) ;
      curl_easy_setopt( curl, CURLOPT_URL,           "http://host/form.php" ) ;
      curl_easy_setopt( curl, CURLOPT_POSTFIELDS,    data ) ;

      CURLcode res = curl_easy_perform( curl ) ;

      if( res == CURLE_OK )
      {
         long code = 0 ;

         curl_easy_getinfo( curl, CURLINFO_RESPONSE_CODE, &code ) ;

         if( code == 200 )
            printf( "Success\n" ) ;
         else
            printf( "HTTP result code: %ld\n", code ) ;
      }
      else
         printf( "Error: %s\n", curl_easy_strerror(res) ) ;

      curl_easy_cleanup( curl ) ;
   }

   return 0 ;
}

Die Funktion Writer ist ein Callback zum Schreiben der Antwort vom Server. In diesem Beispiel ist sie vollkommen leer und verhindert damit die Ausgabe auf die Konsole. Sie wird mit CURLOPT_WRITEFUNCTION bei der Library registriert.

Im Array data sind die URL-Codierten Daten abgelegt, die zum Server geschickt werden sollen. Das Format für eine Variable ist Name=Text, und die Variablen sind durch ein & getrennt. Der Beispielcode schickt die gesamten Daten an einem Stück zum Server.

Der Result-Code von curl-easy-perform sagt relativ wenig aus. Sofern der Server irgend etwas antwortet, betrachtet die Funktion den Aufruf als erfolgreich. Für ein robustes Programm muss auch der Response Code von HTTP abgefragt und geprüft werden.

Der Wert 200 bedeutet, dass der Server die verlangte Aktion fehlerfrei ausführen konnte.

Wenn Sie selber mit dem Code experimentieren wollen, können Sie die Source von CurlPost.cpp hier herunterladen.