2010-12-13 165 views
1

我正在嘗試使用libcurl將XML數據發佈到排序的Web服務。我使用tinyxml來創建一個xml文檔,我希望能夠使用curl進行POST,並使用tinyxml解析XML響應。我搜索了stackoverflow,但沒有任何現有的問題符合我的方案。libcurl POST-CURLOPT_READFUNCTION&CURLOPT_WRITEFUNCTION發佈XML

我無法弄清楚如何從tinyxml打印機/ std :: string到用於POSTing的libcurl,然後將響應接收到內存中以便稍後由tinyxml庫打開。


我幾乎得到了下面的代碼工作,但我經常收到未處理的異常,這可能是由於一些與指針。

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; 
     } 
} 

感謝您的協助。

回答

3

試試這個:

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; 
}