为什么 libcurl 在 JSON 响应字符串后返回"0"?

Why is libcurl returning a "0" after the JSON response string?

本文关键字:quot 返回 libcurl JSON 响应 字符串 为什么      更新时间:2023-10-16

我正在尝试将图像上传到imgur API。我尝试使用邮递员 REST 客户端,它完全返回我想要的内容。当我在C++中使用 libcurl 时,它会返回以下内容:

{"data":{"id":"NsmDwZN","title":null,"description":null,"datetime":1494462656,"type":"image/png","animated":false,"width":28,"height":22,"size":336,"views":0,"bandwidth":0,"vote":null,"favorite":false,"nsfw":null,"section":null,"account_url":null,"account_id":0,"is_ad":false,"in_most_viral":false,"tags":[],"in_gallery":false,"deletehash":"...","name":"","link":"..."},"success":true,"status":200}
0

那个 0 从何而来?

这是我的主要开机自检代码:

int postToImgur(std::string file)
{
curl_global_cleanup();
CURL *curl;
CURLcode res;
// Init winsock stuff
curl_global_init(CURL_GLOBAL_ALL);
// Get curl handle
curl = curl_easy_init();
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = NULL;
if (curl) {
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "image", CURLFORM_FILE, file.c_str(), CURLFORM_END);
headerlist = curl_slist_append(headerlist, "Expect:");
headerlist = curl_slist_append(headerlist, "Authorization: Client-ID bea02xxxxxaf4");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_URL, "https://api.imgur.com/3/image");
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
MessageBox(NULL, _T("Could not upload image. Please check your internet connection."), _T("Error"), NULL);
}
curl_easy_cleanup(curl);
curl_formfree(formpost);
curl_slist_free_all(headerlist);
}
return 0;
}

在我的write_callback函数中,我只需执行以下操作:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
CStringA responseStringA(ptr);
OutputDebugStringA((LPCSTR) responseStringA);

它输出一个"0"。这破坏了我的解析,我不得不手动删除 0,但必须这样做似乎有点草图。关于我可以从哪里得到这个 0 的任何建议?

感谢戴的帮助。Libcurl 不会将响应中的ptr作为以 null 结尾的字符数组传递。这就是我的错误来源。我想我有一个有效的解决方案来创建另一个(更大的)char 数组,复制前一个,并将最后一个字符设置为 null 终止符号。

请检查我的解决方案,并让我知道我是否以某种方式搞砸了:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
char * responseString = new char[nmemb + 1]();
strncpy(responseString, ptr, nmemb);
responseString[nmemb] = '';
OutputDebugStringA(responseString);
...
}