【问题标题】:cURL post fields is encoded with special charcURL post 字段用特殊字符编码
【发布时间】:2016-10-18 12:54:27
【问题描述】:

我在 Visual C++ curl 指针中使用 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;
}

【问题讨论】:

  • 从未将其用作库。但只是检查手册页。您是否尝试过 CURLOPT_COPYPOSTFIELDS 而不是 CURLOPT_POSTFIELDS
  • 手册中的更多内容......您可能还需要一个CURLOPT_POSTFIELDSIZE setter。但也许不是,因为它是一个零终止的 c_str
  • @infixed 您的解决方案现在尝试工作。谢谢。

标签: c++ curl


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2016-10-19
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多