2017-10-02 2 views
0

Je voudrais faire une demande POST en utilisant cURL. J'utilise la bibliothèque this (github: nlohmann/json) pour gérer ma création d'objet JSON. Je reçois le HTTP 200 Response, mais les données POST ne sont pas ajoutées.Demande POST C++ avec cURL + JSON Lib

Lors de l'appel std::cout<< json_data.dump() << std::endl; Je reçois un JSON bien formé.

{ 
    "a": [ 
     { 
      "c": "0", 
      "d": "0", 
      "e": "0", 
      "f": "0", 
      "g": "1506961983", 
      "h": "1506961986", 
      "i": "3" 
     }, 
     { 
      "c": "1", 
      "d": "2", 
      "e": "1", 
      "f": "1", 
      "g": "1506961987", 
      "h": "1506961991", 
      "i": "4" 
     } 
    ], 
    "b": "test" 
} 

Je l'utilise pour ajouter mes données.

struct curl_slist *headers=NULL; 
    headers = curl_slist_append(headers, "Accept: application/json"); 
    headers = curl_slist_append(headers, "Content-Type: application/json"); 
    headers = curl_slist_append(headers, "charsets: utf-8"); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,json_data.dump().c_str()); 

Documentation curl_easy_setopt documentation

Si je regarde dans mes journaux AWS. Il dit:

{ 
    "format": "json", 
    "payload": 5, 
    "qos": 0, 
    "timestamp": 1506961394810, 
    "topic": "test_topic" 
} 

Pourquoi est-il montre la valeur de 5 au lieu de mon objet JSON?

Merci pour votre aide, si quelqu'un sait pourquoi.

Répondre

2

Sur cette ligne:

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.dump().c_str()); 

L'objet chaîne retournée par dump() est temporaire et détruit lorsque curl_easy_setopt() sorties, laissant ainsi CURLOPT_POSTFIELDS avec un pointeur ballants qui peuvent ou peuvent ne pas toujours pointer vers les données JSON en mémoire au moment où libCURL essaie de l'afficher.

par le CURLOPT_POSTFIELDS documentation:

Les données pointé est pas copié par la bibliothèque: en conséquence, il doit être conservé par l'application d'appel jusqu'à ce que le transfert se termine associé. Ce comportement peut être modifié (de sorte que libcurl copie les données) en définissant l'option CURLOPT_COPYPOSTFIELDS.

Donc, vous devez soit:

  • changement CURLOPT_POSTFIELDS-CURLOPT_COPYPOSTFIELDS:

    curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, json_data.dump().c_str()); 
    
  • sauver le résultat de json_data.dump() à une variable locale qui ne va pas hors de portée jusqu'à ce que après curl_easy_perform() sorties:

    std::string json = json_data.dump(); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str()); 
    ... 
    
+0

Merci. Je vais essayer cela et revenir à vous. – zer02

+0

travaillé! Merci beaucoup!. – zer02