2010-12-14 95 views
2

J'essaie de POST les données XML à partir d'un programme c en utilisant libcurl à un site Web. Lorsque j'utilise le programme de ligne de commande sous Linux, curl comme cela, il fonctionne très bien:c libcurl POST ne fonctionne pas de manière cohérente

boucle -X POST -H 'Content-Type: text/xml' -d 'mes données xml' http://test.com/test.php

(I changé les données réelles pour la sécurité)

Mais dès que j'essaie d'écrire du code c en utilisant libcurl, il échoue presque à chaque fois mais réussit de temps en temps. Voici mon code c:

CURL *curl; 
CURLcode res; 

curl = curl_easy_init(); 

if(curl) 
{ 
    curl_easy_init(curl, CURLOPT_URL, "http://test.com/test.php"); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xmlString.c_str()); 
    curl_easy_perform(curl); 
} 

curl_easy_cleanup(curl); 

J'ai ce code dans une boucle qui passe toutes les 10 secondes et il ne réussira que sur tous les 4 ou 5 appels. Je reçois des erreurs du serveur qui disent "XML Head not found".

J'ai essayé spécifier l'en-tête HTTP avec:

struct curl_slist *chunk = NULL 
chunk = curl_slist_append(chunk, "Content-type: text/xml"); 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); 

Mais je n'ai pas de chance. Des idées?

Répondre

8

Essayez ceci:

CURL *curl = curl_easy_init(); 
if(curl) 
{ 
    curl_easy_setopt(curl, CURLOPT_URL, "http://test.com/test.php"); 
    curl_easy_setopt(curl, CURLOPT_POST, 1); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xmlString.c_str()); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xmlString.length()); 
    struct curl_slist *slist = curl_slist_append(NULL, "Content-Type: text/xml; charset=utf-8"); // or whatever charset your XML is really using... 
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); 
    curl_easy_perform(curl); 
    curl_slist_free_all(slist); 
    curl_easy_cleanup(curl); 
} 
+0

Cela a fonctionné. Merci. – rplankenhorn