libcurl POST HTTPS envoi de données?
J'ai demande que les données reçues via HTTP POST demandes. Je suis en train d'utiliser libcurl pour ouvrir une demande à cette application, envoyer les données et de recevoir la réponse de l'application. C'est le code que j'ai pour l'instant:
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;
}
Cette substance se connecte au serveur, je reçois un OK sur le curl_easy_perform()
. Je peux voir le lien sur Wireshark.
Deux questions:
1) Est-ce la bonne façon de l'envoi de données par l'intermédiaire d'un POST, et
2) Comment puis-je obtenir la réponse de l'application.
J'ai pensé que j'ai besoin d'utiliser curl_easy_recv()
mais je ne vois pas comment. Tout exemple de code est la bienvenue.
Merci.
OriginalL'auteur Mr Aleph | 2011-10-21
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez également envisager d'ajouter un gestionnaire pour les en-têtes de réponse:
Il se peut que, si c'est un service web conçu pour une utilisation par une application, sa réponse est une tête de ne répondre que, en l'absence de réponse de données. L'en-tête devrait contenir des données telles que:
Où la principale chose que vous cherchez est la
200
code dire la demande a été OK.Les fonctions pour gérer les données d'en-tête ou de la réponse devrait prendre un void*, et vous aurez besoin d'un zéro à la fin, si vous l'utilisez comme une chaîne de caractères. Pour info c'est comment je gère les données entrantes (dans ce cas, je n'utilise que le code de retour dans mon application - le corps de la réponse va juste pour un fichier journal):
De gestion d'erreur supprimé pour des raisons de concision!
Pour info, il devrait être un void *ptr, pas un char *ptr, mais je vais modifier ma réponse avec le code que j'utilise pour gérer la réponse.
Il a obtenu, grâce. Maintenant, j'ai besoin de commencer l'analyse de toutes les informations. merci pour l'aide
On dirait que vous êtes en bonne forme maintenant! Merci, @asc99c.
OriginalL'auteur asc99c
Vous n'avez pas besoin d'appeler une fonction de réception. Le reçu de réponse vient de nouveau à vous lorsque le contrôle passe à l'écriture fini de rappel. Mis en place ce rappel quelque chose comme ceci:
curl_res = curl_easy_setopt( poignée, CURLOPT_WRITEFUNCTION, RecvResponseCallback );
avant d'appeler effectuer.
Définir la fonction de rappel comme ceci:
Les données de réponse est indiqué par le données arg (pas le ptr arg, qui est quelque chose que vous aurez envie de regarder quand vous obtenez ce travail).
Lorsque vous quittez RecvResponseCallback, assurez-vous de retour
(size_t) size * nmemb
Lorsque réglé et que j'appelle effectuez-je obtenir
Error: Too many open files in system
Quel est le système que vous sont en cours d'exécution en vertu de l'? Je pense que libcurl a qu'à ouvrir un autre fichier de la socket de recevoir. Alors, comment beaucoup de fichiers avez-vous ouvert votre programme?
pas de fichiers ouverts. Le code est exécuté sur Linux et Mac OS
Même erreur sous Linux et Mac OS?
OriginalL'auteur Pete Wilson