卷曲 post 空 object

Curl post null object

我使用了 curl 帮助中的示例代码,但服务器收到空 objects 和空自定义 header。 GET 方法工作正常。 strbuf.GetString() - json object 转换为字符串。

CURL *curl;
CURLcode res;
struct WriteThis pooh;
res = curl_global_init(CURL_GLOBAL_DEFAULT);
struct curl_slist *headers=NULL; 
curl_slist_append(headers, "Accept: application/json");  
curl_slist_append( headers, "Content-Type: application/json");
curl_slist_append( headers, "charset: utf-8"); 
curl_slist_append( headers, "AuthToken: 9BA1B05482567E64037573FFB68672DCB52E4993"); 
curl = curl_easy_init();
if (curl) 
{
  pooh.readptr = strbuf.GetString();
  pooh.sizeleft = (long)strlen(strbuf.GetString());
  curl_easy_setopt(curl, CURLOPT_URL, url);
  curl_easy_setopt(curl, CURLOPT_POST, 1L);
  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
  curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);
  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,writer);
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, &pooh);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);
  res = curl_easy_perform(curl);
  if (CURLE_OK == res) 
  { 
    char *ct;         
    res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
    if((CURLE_OK == res) && ct){    

                         }
  }
curl_easy_cleanup(curl);
}
curl_global_cleanup();

struct WriteThis {
    const char *readptr;
    long sizeleft;
};

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
    struct WriteThis *pooh = (struct WriteThis *)userp;

    if(size*nmemb < 1)
        return 0;

    if(pooh->sizeleft) {
        *(char *)ptr = pooh->readptr[0]; /* copy one single byte */ 
        pooh->readptr++;                 /* advance pointer */ 
        pooh->sizeleft--;                /* less data left */ 
        return 1;                        /* we return 1 byte at a time! */ 
    }

    return 0;                          /* no more data left to deliver */ 
}
  1. 您设置了 读取回调和 CURLOPT_POSTFIELDS。那没有用。您需要决定以何种方式提供数据。在这种情况下,我相信它会使用 POSTFIELDS 并忽略读取回调。

  2. 您传递给 CURLOPT_POSTFIELDS 的指针不是字符串,因此 libcurl 将从那里发送有趣的二进制文件 "garbage"。您可能想在那里传递 pooh.readptr

改为:

struct curl_slist *headers = NULL; 
curl_slist_append(headers, "Accept: application/json");  
curl_slist_append(headers, "Content-Type: application/json");
curl_slist_append(headers, "charset: utf-8"); 
curl_slist_append(headers, "AuthToken: 9BA1B05482567E64037573FFB68672DCB52E4993"); 
curl = curl_easy_init();

这个:

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, "charset: utf-8"); 
headers = curl_slist_append(headers, "AuthToken: 9BA1B05482567E64037573FFB68672DCB52E4993"); 
curl = curl_easy_init();