JSON demandes en C à l'aide de libcurl
Je suis à la définition d'une requête PUT avec un JSON du corps de la requête à l'aide de libcurl dans C.
Ce comment je le fais:
sprintf(jsonObj, "\"name\" : \"%s\", \"age\" : \"%s\"", name, age);
struct curl_slist *headers = NULL;
curl_slist_append(headers, "Accept: application/json");
curl_slist_append(headers, "Content-Type: application/json");
curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1");
res = curl_easy_perform(curl);
Le corps de la requête est arrivée comme ceci:
{ '"name" : "Pedro", "age" : "22"' }
Avec { '
au début et à la ' }
à la fin.
--- PLUS D'INFO -----
si je déclare ce code
char* jsonObj = "{ \"name\" : \"Pedro\" , \"age\" : \"22\" }";
struct curl_slist *headers = NULL;
curl_slist_append(headers, "Accept: application/json");
curl_slist_append(headers, "Content-Type: application/json");
curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1");
res = curl_easy_perform(curl);
le serveur reçoit ce que le corps de la requête:
{ '{ "name" : "Pedro" , "age" : "22" }': '' }
Ma question est:
Est la libCurl pré-formatage/encodage automatiquement le Json demande?
Par la voie, ne la libCurl, disposer d'un moyen de codage d'un objet JSON?
Merci beaucoup!
OriginalL'auteur Pedro Baptista Afonso | 2012-08-15
Vous devez vous connecter pour publier un commentaire.
Le problème peut être avec les en-têtes. Lorsque vous configurez votre curl_slist en-têtes je pense que vous devriez affecter la sortie de curl_slist_append retour à des en-têtes:
Qu'est-ce que le
"charsets: utf-8"
en-tête? Ressemble à une erreur. Vous devriez probablement utiliserContent-Type: application/json; charset=utf-8
à la place.OriginalL'auteur
Tout d'abord, précisons un peu les choses. Pour commencer, Daniel Stenberg est correct (comme je l'avais espoir qu'il serait, étant donné qu'il a écrit le code): libcurl ne pas ajouter des données à votre code. Je peux le démontrer avec cet exemple de programme, qui est comme votre exemple, mais avec une configuration supplémentaire/démontage de code. C'est tous du code: il n'y a rien d'autre ici présents:
Paquet de la capture de la demande, avec Wireshark montre que ce qui émet de la suite de la requête HTTP:
Comme vous pouvez le voir, c'est exactement les données JSON vous avez demandé à envoyer. Il n'existe pas de données supplémentaires ici, pas d'accolades de délimitation.
Cela signifie que les accolades supplémentaires sont ajoutées, soit par votre serveur ou par l'intermédiaire middlebox. Ma conjecture est que votre serveur est de l'ajouter parce que c'est à force d'essayer de transformer n'importe quel corps qui n'est pas un
application/json
corps en en considérant le corps entier en une chaîne de caractères.La raison que votre serveur ne prend pas en considération ce format JSON corps est encapsulé par une autre réponse ici: vous n'êtes pas le réglage de vos en-têtes correctement.
curl_slist_append
retourne une nouvellestruct curl_slist *
que vous devez assigner de nouveau dans votreheaders
variable. Cela signifie que vous devez changer ces quatre lignes:de ces quatre:
Cela devrait convaincre votre serveur que vous envoyez des données JSON.
Dans l'avenir, je vous recommande de vous familiariser avec Wireshark pour résoudre ce type de problèmes. Il est extrêmement utile de voir la demande réelle que vous avez envoyé. À défaut, si vous ne souhaitez pas, vous pouvez utiliser
CURLOPT_DEBUGFUNCTION
extraire les données curl est l'envoi de la valider.OriginalL'auteur
libcurl enverra exactement les octets de vous demander d'envoyer. Il n'a pas connaissance de JSON.
Voir @Lukasa est excellente et la plus élaborée de réponse pour le meilleur et pour plus de détails.
"name" : "Pedro", "age" : "22"
et la chaîne de caractères reçue est{ '"name" : "Pedro", "age" : "22"' }
?Si vous n'avez pas d'envoyer le '{' et '}', alors vous ne les recevrez pas. Alors je suppose que votre JSON gestionnaire qui reçoit les données ajoute par lui-même pour vous comme un service ou un produit similaire.
je pense que c'est à cause de l'en-tête, le type de contenu que vous spécifiez.
Je branlant a écrit libcurl. Je sais ce qu'il fait et ne fait pas. Il n'y a littéralement rien en libcurl qui ajoute des accolades pour publier des données. Rien. Vous pouvez prétendre que tout ce que vous voulez. Si ces accolades fin jusqu'à l'extrémité de réception, ils ont été ajoutés par quelque chose d'autre que de la libcurl.
Daniel est à droite, et vous êtes incorrect. Voir ma réponse pour une explication complète.
OriginalL'auteur
J'ai eu un Problème similaire.
J'ai découvert la libcurl option pour la commande curl.
Il a beaucoup aidé! Il suffit de l'ajouter à la fin de votre commande curl.
À la fin il m'aider à créer ce code:
Express reçoit JSON:
J'espère que cela aide!
--libcurl
option, car cette réponse. Il aide beaucoup! Merci!!!!OriginalL'auteur
Un élément clé de la compréhension de savoir si le système fonctionne correctement, c'est de voir ce que le programme est en fait l'envoi sur le réseau. Donc, une autre façon de vérifier le flux d'octets, au lieu de pointer vers votre serveur (et/ou l'exécution de Wireshark), est de simplement exécuter un netcat instance dans une fenêtre séparée sur la machine de test:
et le point le code (CURLOPT_URL) à "http://localhost:8080".
Vous aurez besoin de frapper ctrl + D dans le
nc
fenêtre pour mettre fin à la connexion de sorte que curl est terminée mais vous pouvez également taper un test de renvoyer le texte à l'avance, qui peut être utile si vous vous attendez à une sorte de réponse à tester.OriginalL'auteur
J'ai utilisé json-c pour l'encodage et le décodage jsons et ça a très bien fonctionné.
La documentation est également facile à comprendre.
https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/
OriginalL'auteur