C++ cURL post字段使用特殊字符编码

C++ cURL post字段使用特殊字符编码,c++,curl,C++,Curl,我使用Curl在VisualC++中的CURL指针共享函数。 setData函数被编码发送到服务器,但没有函数就没有编码问题。为什么会有这样的问题 资料来源: static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return siz

我使用Curl在VisualC++中的CURL指针共享函数。 setData函数被编码发送到服务器,但没有函数就没有编码问题。为什么会有这样的问题

资料来源:

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);

    return size * nmemb;
}

void setData(CURL *curl) // bad working (encoded sent fields...)
{
    string fields = "{\"daa\": \"a\"}";

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.c_str());
}

void setUrl(CURL* curl) // good working
{
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
}

int main()
{
    CURL *curl;
    CURLcode res;
    string readBuffer;

    curl = curl_easy_init();
    struct curl_slist *list = NULL;

    list = curl_slist_append(list, "Content-Type: application/json");

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);

    setUrl(curl);
    setData(curl);
    res = curl_easy_perform(curl);

    cout << readBuffer;

    getchar();

    return 0;
}
静态大小写回调(void*contents、size\t size、size\t nmemb、void*userp)
{
((std::string*)userp)->追加((char*)内容,大小*nmemb);
返回大小*nmemb;
}
void setData(CURL*CURL)//工作不好(编码的发送字段…)
{
字符串字段=“{\“daa\”:\“a\”}”;
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,fields.c_str());
}
void setUrl(CURL*CURL)//工作正常
{
curl\u easy\u setopt(curl,CURLOPT\u URL,“http://example.com");
}
int main()
{
卷曲*卷曲;
卷曲编码;
字符串读取缓冲区;
curl=curl_easy_init();
struct curl\u slist*list=NULL;
list=curl\u slist\u append(list,“内容类型:application/json”);
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,“POST”);
curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,WriteCallback);
curl\u easy\u setopt(curl、CURLOPT\u WRITEDATA和readBuffer);
curl\u easy\u setopt(curl,CURLOPT\u HTTPHEADER,list);
setUrl(curl);
setData(curl);
res=旋度(curl)\u容易执行(curl);

这里的问题是存储所有权的问题

如果您使用
CURLOPT_POSTFIELDS
,则必须确保数据存储将保持持久性,直到您将其与curl一起使用。因为在您的程序中,该字符串是一个局部变量,因此会出现问题。当子例程结束时,所有权消失,其他一些东西可以使用该内存


如果您使用变体
CURLOPT_COPYPOSTFIELDS
,您就可以解决这个问题,因为curl会将数据复制到它拥有的存储中

这里的问题是存储所有权的问题

如果您使用
CURLOPT_POSTFIELDS
,则必须确保数据存储将保持持久性,直到您将其与curl一起使用。因为在您的程序中,该字符串是一个局部变量,因此会出现问题。当子例程结束时,所有权消失,其他一些东西可以使用该内存


如果您使用变体
CURLOPT\u COPYPOSTFIELDS
,您会绕过这个问题,因为curl会将数据复制到它所拥有的存储中

从未将其用作库。但只需检查手册页。您是否尝试过
CURLOPT\u COPYPOSTFIELDS
而不是
CURLOPT\u POSTFIELDS
?以及手册中的更多内容……您可能需要
CURLOPT_POSTFIELDSIZE
setter也在其中。但可能不是,因为它是一个以零结尾的c_str@infixed您的解决方案现在已开始运行。谢谢。从未将其用作库。只是检查手册页。您是否尝试过
CURLOPT\u COPYPOSTFIELDS
而不是
CURLOPT\u POSTFIELDS
?以及手册中的更多内容……您可能也需要一个
CURLOPT_POSTFIELDSIZE
setter,但可能不需要,因为它是一个以零结尾的c_str@infixed您的解决方案现在已开始运行。谢谢。