libcurl HTTPS POST Daten senden?
Habe ich Anwendung, die empfangenen Daten über HTTP POST Anfragen. Ich versuche, libcurl zu öffnen, eine Anfrage zu dieser app, die Daten senden und empfangen der Antworten aus der app. Dies ist der code den ich bisher:
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("Error: %s\n", strerror(res));
return 1;
}
//now what?
//cleanup when done
curl_easy_cleanup(curl);
}
return 0;
}
Dies ist im wesentlichen eine Verbindung zum server, bekomme ich ein OK auf die curl_easy_perform()
. Ich kann sehen, dass die Verbindung auf Wireshark.
Zwei Fragen:
1) Ist dies der richtige Weg, das senden von Daten über eine POST, und
2) Wie bekomme ich die Antwort von der Anwendung.
Dachte ich, ich curl_easy_recv()
aber ich kann nicht sehen, wie. Jede sample-code ist willkommen.
Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie sollten auch prüfen, indem Sie einen handler für die Antwort-Header:
Kann es sein, dass, wenn dies ist ein web-service konzipiert für die Verwendung durch eine Anwendung, seine Antwort ist eine header-einzige Antwort, die keine Antwort-Daten. Der header enthält Daten wie:
Wo die wichtigste Sache, die Sie suchen, ist die
200
code sagen, der Antrag war OK.Den Funktionen, die die Daten verarbeitet, die entweder vom Kopf-oder-Antwort, sollte ein void*, und Sie müssen Sie zu null-es zu beenden, wenn Sie es als ein string. Zur info, das ist, wie ich mit dem eingehende Daten (in diesem Fall ich, nur mit der return-code in meiner Anwendung - die Antwort der Körper geht nur um eine log-Datei):
Fehlerbehandlung aus Gründen der Kürze entfernt!
Brauchen Sie nicht zu nennen, alle receive-Funktion. Die Antwort erhalten zurück zu Ihnen kommt, wenn die Kontrolle geht auf den schreiben-fertig Rückruf. Set-up, Rückruf, so etwas wie dieses:
curl_res = curl_easy_setopt( handle, CURLOPT_WRITEFUNCTION, RecvResponseCallback );
vor dem Aufruf durchführen.
Definieren Sie die callback so:
Den response-Daten zeigte die Daten arg (nicht der ptr arg, das ist etwas anderes, das Sie betrachten möchten, wenn Sie sich diese Arbeit).
Beim verlassen RecvResponseCallback, sicher sein, um zurück
(size_t) size * nmemb
Error: Too many open files in system
data
zu einem string? Diechar*
in der callback-Funktion ist praktisch nutzlos jetzt. Ich habe versucht, das Spiel mitCURLOPT_WRITEDATA
ich aber nur vertan. Das ist verrückt, einfach nur, um Daten zurück an den server ist entsetzlich kompliziert. Irgendwelche Ideen? Ich brauche nur den Körper der gesendeten Daten nach dem 200 OK header vom server.