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

时间:2016-10-18 12:54:27

标签: c++ curl

我在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;
}

1 个答案:

答案 0 :(得分:0)

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

如果您使用CURLOPT_POSTFIELDS,则必须确保数据存储将保持持久,直到您完成curl使用它为止。因为在你的程序中,字符串是局部变量,所以它会出现问题。当子程序结束时,所有权就会消失,其他东西也可以使用那个记忆。

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