2010-12-13 1 views
1

Je tente d'utiliser libcurl pour publier des données XML sur un service Web de type tri. J'utilise tinyxml pour créer un document XML, et j'aimerais pouvoir POST utiliser curl et analyser la réponse XML avec tinyxml. J'ai cherché stackoverflow, mais aucune des questions existantes ne correspond à mon scénario.libcurl POST - CURLOPT_READFUNCTION & CURLOPT_WRITEFUNCTION pour la publication XML

Je n'arrive pas à comprendre comment passer d'une imprimante tinyxml/std :: string à libcurl pour POSTing, puis recevoir la réponse en mémoire pour être ouverte par la bibliothèque tinyxml plus tard.


J'ai presque obtenu le code suivant au travail, mais je reçois souvent des exceptions non gérées, qui sont probablement dues à quelque chose avec des pointeurs.

typedef struct{ 
    void *data; 
    int body_size; 
    int bytes_remaining; 
    int bytes_written; 
} postdata; 


size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream) { 

if(stream) { 
    postdata *ud = (postdata*)stream; 

if(ud->bytes_remaining) { 
    if(ud->body_size > size*nmemb) { 
     memcpy(ptr, ud->data+ud->bytes_written, size*nmemb); 
     ud->bytes_written+=size+nmemb; 
ud->bytes_remaining = ud->body_size-size*nmemb; 
     return size*nmemb; 


} else { 
    memcpy(ptr, ud->data+ud->bytes_written, ud->bytes_remaining); 
      ud->bytes_remaining=0; 
    return 0; 
     } 
} 

Nous vous remercions de votre aide.

Répondre

3

Essayez ceci:

typedef struct 
{ 
    void *data; 
    int body_size; 
    int body_pos; 
} postdata; 


size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    if (stream) 
    { 
     postdata *ud = (postdata*) stream; 

     int available = (ud->body_size - ud->body_pos); 

     if (available > 0) 
     { 
      int written = min(size * nmemb, available); 
      memcpy(ptr, ((char*)(ud->data)) + ud->body_pos, written); 
      ud->body_pos += written; 
      return written; 
     } 
    } 

    return 0; 
}