Ошибочный ответ API в C++
Число в CURLINFO_RESPONSE_CODE не всегда равно
200.
Ошибочный ответ может содержать HTML или короткое
сообщение, которое не стоит разбирать как успешный
JSON. Несуществующий путь на typicode дает
404. Сначала проверяют код, и только при
200 передают тело в parse:
#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://jsonplaceholder.typicode.com/not-a-route"
);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
long code = 0;
curl_easy_getinfo(
curl,
CURLINFO_RESPONSE_CODE,
&code
);
if (code == 200) {
nlohmann::json note = nlohmann::json::parse(body);
std::cout << note.at("note").get<std::string>()
<< "\n";
} else {
std::cout << code << "\n";
}
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}
Локальная строка с синтаксической ошибкой JSON
вызывает nlohmann::json::parse_error. Ее
перехватывают, чтобы программа завершилась штатно
и напечатала текст причины:
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
int main() {
std::string broken = R"(["a", "b", "c",])";
try {
nlohmann::json tags = nlohmann::json::parse(broken);
std::cout << tags.size() << "\n";
} catch (const nlohmann::json::parse_error& ex) {
std::cout << ex.what() << "\n";
}
return 0;
}
Дана строка с некорректным JSON. Попытайтесь
разобрать ее в nlohmann::json. Выведите
результат или текст ошибки, не прерывая работу
программы аварийно.