11 Stimmen

Libcurl HTTPS POST-Daten senden?

Ich habe eine Anwendung, die Daten über HTTP-POST-Anfragen empfängt. Ich versuche, libcurl zu verwenden, um eine Anfrage an diese App zu öffnen, die Daten zu senden und die Antwort von der App zurückzuerhalten. Dies ist der Code, den ich bisher habe:

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) 
    {
        const int timeout = 30000;
        char outputmessage[]="VGhpcyBpcyBqdXN0IGEgbWVzc2FnZSwgaXQncyBub3QgdGhlIHJlYWwgdGhpbmc=";

        curl_easy_setopt(curl, CURLOPT_URL, "https://somehost.com/someapp");
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.5");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, outputmessage);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(outputmessage));
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout/1000);

        res = curl_easy_perform(curl);
        if(CURLE_OK != res)
        {
            printf("Fehler: %s\n", strerror(res));
            return 1;
        }

        // und jetzt?

        // Bereinigung, wenn fertig
        curl_easy_cleanup(curl);
    }
    return 0;
}

Dies verbindet im Wesentlichen mit dem Server, ich bekomme ein OK beim curl_easy_perform(). Ich sehe die Verbindung in Wireshark.

Zwei Fragen:

1) Ist dies der richtige Weg, um Daten über einen POST zu senden, und
2) Wie erhalte ich die Antwort von der Anwendung.

Ich dachte, ich müsse curl_easy_recv() verwenden, aber ich sehe nicht, wie. Jeder Beispielcode ist willkommen. Danke.

5voto

asc99c Punkte 3735

Ich denke, du solltest auch in Betracht ziehen, einen Handler für die Antwort-Header hinzuzufügen:

cres = curl_easy_setopt( handle, CURLOPT_HEADERFUNCTION, HandleHeader );

Es könnte sein, dass wenn dies ein für Anwendungen konzipierter Webservice ist, seine Antwort nur aus einem Header besteht, ohne Antwortdaten. Der Header könnte Daten wie diese enthalten:

HTTP/1.1 200 OK ...

Wo das Wichtigste ist, dass du den 200 Code siehst, der besagt, dass die Anfrage erfolgreich war.

Die Funktionen zum Verarbeiten der Daten vom Header oder der Antwort sollten ein void* nehmen, und du musst es mit einem Nullzeichen terminieren, wenn du es als Zeichenkette verwendest. Hier ist, wie ich die eingehenden Daten verarbeite (in diesem Fall verwende ich den Rückgabecode nur in meiner Anwendung - der Antworttext geht einfach in eine Protokolldatei):

static size_t CurlHandleResponse(
  void *Ptr,
  size_t Size,
  size_t NoElements,
  void* Data )
{
  memcpy( &( gData[gDataLen] ), Ptr, (Size * NoElements) );
  gDataLen += (Size * NoElements);
  gData[ gDataLen ] = '\0';
  return (Size * NoElements);
}

...
ConvertUnprintable( gData, PrintStr );
...

Fehlerbehandlung wurde aus Gründen der Kürze entfernt!

1voto

Pete Wilson Punkte 8406

Sie müssen keine Empfangsfunktion aufrufen. Die empfangene Antwort kommt zu Ihnen zurück, wenn die Kontrolle an den Schreib-Fertig-Callback übergeben wird. Richten Sie diesen Callback wie folgt ein:

curl_res = curl_easy_setopt( handle, CURLOPT_WRITEFUNCTION, RecvResponseCallback );

bevor Sie perform aufrufen.

Definieren Sie den Callback wie folgt:

size_t
RecvResponseCallback ( char *ptr, size_t size, size_t nmemb, char *data ) {
  // Behandeln Sie empfangene Daten
  return size * nmemb;
}

Die Antwortdaten werden durch das Argument data angezeigt (nicht das Argument ptr, das etwas anderes ist, worauf Sie achten sollten, wenn Sie dies zum Laufen bringen).

Wenn Sie RecvResponseCallback verlassen, stellen Sie sicher, dass Sie (size_t) size * nmemb zurückgeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X