我在Visual C ++卷曲指针中使用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;
}
答案 0 :(得分:0)
这里的问题是存储所有权问题。
如果您使用CURLOPT_POSTFIELDS
,则必须确保数据存储将保持持久,直到您完成curl使用它为止。因为在你的程序中,字符串是局部变量,所以它会出现问题。当子程序结束时,所有权就会消失,其他东西也可以使用那个记忆。
如果您使用变体CURLOPT_COPYPOSTFIELDS
,那么您可以解决这个问题,因为curl会将数据复制到它拥有的存储空间