Ich möchte eine sehr einfache C-Anwendung erstellen, die einen HTTP-Beitrag erstellt. Es werden einige Parameter benötigt, mit denen eine URL erstellt wird. Ich möchte nur einen einfachen HTTP-POST durchführen und die Antwort ohne Verwendung von Curl erhalten (die Bibliotheken sind nicht und werden nicht auf dem Computer installiert, der ausgeführt werden muss).
Pseudocode:
Prozess 2 Argumente
Fügen Sie Argumente in die URL der Vorlage ein: http://api.somesite.com/apikey=ARG1&command=ARG2
POST für generierte URL
Antwort verbrauchen
Meine Google- und SO-Suche hat diesbezüglich nichts ergeben.
Antworten:
Eine Nachricht besteht aus einem Kopfteil und einem Nachrichtentext, die durch eine Leerzeile getrennt sind. Die leere Zeile wird IMMER benötigt, auch wenn kein Nachrichtentext vorhanden ist. Der Header beginnt mit einem Befehl und enthält zusätzliche Zeilen mit Schlüsselwertpaaren, die durch einen Doppelpunkt und ein Leerzeichen getrennt sind. Wenn es einen Nachrichtentext gibt, kann es alles sein, was Sie möchten.
Zeilen in der Kopfzeile und die leere Zeile am Ende der Kopfzeile müssen mit einem Carraige-Return- und Zeilenvorschubpaar enden (siehe Zeilenumbruchstil für HTTP-Kopfzeilen ). Deshalb haben diese Zeilen am Ende \ r \ n.
Eine URL hat die Form
http://host:port/path?query_string
Es gibt zwei Möglichkeiten, eine Anfrage an eine Website zu senden:
GET: Die Abfragezeichenfolge ist optional, muss jedoch, falls angegeben, relativ kurz sein. Aus diesem Grund könnte der Header nur der Befehl GET sein und sonst nichts. Eine Beispielnachricht könnte sein:
POST: Was normalerweise in der Abfragezeichenfolge enthalten ist, befindet sich stattdessen im Nachrichtentext. Aus diesem Grund muss der Header die Attribute Content-Type: und Content-Length: sowie den Befehl POST enthalten. Eine Beispielnachricht könnte sein:
Um Ihre Frage zu beantworten: Wenn die URL, an die Sie POSTEN möchten, http://api.somesite.com/apikey=ARG1&command=ARG2 lautet, gibt es keinen Text oder eine Abfragezeichenfolge und folglich keinen Grund für POST, da dort ist nichts, was in den Nachrichtentext eingefügt werden soll, und daher nichts, was in den Inhaltstyp: und die Inhaltslänge: eingefügt werden muss.
Ich denke, Sie könnten POSTEN, wenn Sie wirklich wollten. In diesem Fall würde Ihre Nachricht folgendermaßen aussehen:
Um die Nachricht zu senden, muss das C-Programm:
Die Sende- und Empfangsanrufe senden / empfangen nicht unbedingt ALLE Daten, die Sie ihnen geben - sie geben die Anzahl der tatsächlich gesendeten / empfangenen Bytes zurück. Es liegt an Ihnen, sie in einer Schleife aufzurufen und den Rest der Nachricht zu senden / empfangen.
Was ich in diesem Beispiel nicht getan habe, ist eine echte Fehlerprüfung - wenn etwas fehlschlägt, beende ich einfach das Programm. Lassen Sie mich wissen, ob es für Sie funktioniert:
Wie die andere Antwort gezeigt hat, sind 4096 Bytes keine sehr große Antwort. Ich habe diese Zahl zufällig ausgewählt, unter der Annahme, dass die Antwort auf Ihre Anfrage kurz sein würde. Wenn es groß sein kann, haben Sie zwei Möglichkeiten:
Zusätzliche Informationen zur Beantwortung der in den Kommentaren gestellten Frage:
Was ist, wenn Sie Daten im Nachrichtentext POSTEN möchten? Dann müssen Sie die Überschriften Content-Type: und Content-Length: einfügen. Die Inhaltslänge: ist die tatsächliche Länge von allem nach der Leerzeile, die den Header vom Body trennt.
Hier ist ein Beispiel, das die folgenden Befehlszeilenargumente verwendet:
Für die ursprüngliche Frage würden Sie also Folgendes ausführen:
Und für die Frage in den Kommentaren, die Sie ausführen würden:
Hier ist der Code:
quelle
\r\n
) beendet werden müssen, dieser Code verwendet jedoch reine Zeilenvorschübe ."POST /variableName=%s&value=%s HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\n\r\n"
Ich möchte wie name = reaz posten. Es antwortet 400 Bad RequestJerrys Antwort ist großartig. Es werden jedoch keine großen Antworten verarbeitet. Eine einfache Änderung, um damit umzugehen:
quelle
bytes = recv(sockfd, response, 1023, 0)
Nach wochenlanger Forschung. Ich habe mir den folgenden Code ausgedacht. Ich glaube, dies ist das absolute Minimum, um eine sichere Verbindung mit SSL zu einem Webserver herzustellen.
Der obige Code erklärt ausführlich, wie eine TLS-Verbindung mit einem Remote-Server hergestellt wird.
Wichtiger Hinweis : Dieser Code prüft nicht, ob der öffentliche Schlüssel von einer gültigen Behörde signiert wurde. Das heißt, ich verwende keine Stammzertifikate zur Validierung. Vergessen Sie nicht, diese Prüfung durchzuführen, da Sie sonst nicht wissen, ob Sie die richtige Website verbinden
Wenn es um die Anfrage selbst geht. Es ist nichts weiter als das Schreiben der HTTP-Anfrage von Hand.
Unter diesem Link finden Sie auch eine Erklärung zum Installieren von openSSL in Ihrem System und zum Kompilieren des Codes, damit die sichere Bibliothek verwendet wird .
quelle
Griff hinzugefügt.
Host-Header hinzugefügt.
Linux / Windows-Unterstützung hinzugefügt, getestet (XP, WIN7).
WARNUNG: FEHLER: "Segmentierungsfehler", wenn kein Host, Pfad oder Port als Argument vorhanden ist.
quelle