Curl post null object

Curl post null object

本文关键字:object null post Curl      更新时间:2023-10-16

我使用了curl帮助中的示例代码,但服务器接收到空对象和空自定义头。GET方法运行良好。strbuf.GetString()-它是转换为String的json对象。

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将从那里发送有趣的二进制"垃圾"。你可能想在那里通过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();