libcurl POST - CURLOPT_READFUNCTION&用于发布XML的CURLOPT_WRITEFUNCTION

时间:2010-12-13 22:47:59

标签: c++ xml post libcurl

我正在尝试使用libcurl将XML数据发布到一种Web服务。我正在使用tinyxml来创建一个xml文档,我希望能够使用curl对其进行POST,并使用tinyxml解析XML响应。我搜索了stackoverflow,但现有的问题都不符合我的情况。

我无法弄清楚如何从tinyxml打印机/ std :: string转到libcurl进行POST,然后将响应接收到内存中,稍后由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;
        }
}

感谢您的协助。

1 个答案:

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