#c #json #curl #libcurl
#c #json #curl #libcurl
Вопрос:
Я пытаюсь загрузить файл json с веб-страницы REST на C с помощью libcurl. Следующий код работает, если я захожу на веб-страницу, но он не загружается, если я пытаюсь получить доступ к json….
Я думаю, это должно быть легко исправить, но я не могу найти ни одной ссылки на это…
Если я перехожу на веб-страницу, открывается json, но этот код возвращает только текст / html; кодировка = utf-8
??????????
CURL *curl;
CURLcode res;
struct curl_slist *headers=NULL; // init to NULL is important
headers = curl_slist_append(headers, "Accept: application/json");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://web.com/api/json/123");
curl_easy_setopt(curl, CURLOPT_HTTPGET,1);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
//curl_easy_setopt(curl, CURLOPT_URL, "http://web.com/123.html");//this works!!!
res = curl_easy_perform(curl);
if(CURLE_OK == res) {
char *ct;
/* ask for the content-type */
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, amp;ct);
if((CURLE_OK == res) amp;amp; ct)
printf("We received Content-Type: %sn", ct);
}
}
/* always cleanup */
curl_easy_cleanup(curl);
Ответ №1:
std::string ServerContent::DownloadJSON(std::string URL)
{
CURL *curl;
CURLcode res;
struct curl_slist *headers=NULL; // init to NULL is important
std::ostringstream oss;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "charset: utf-8");
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, URL.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPGET,1);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,writer);
res = curl_easy_perform(curl);
if (CURLE_OK == res)
{
char *ct;
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, amp;ct);
if((CURLE_OK == res) amp;amp; ct)
return *DownloadedResponse;
}
}
curl_slist_free_all(headers);
}
static std::string *DownloadedResponse;
static int writer(char *data, size_t size, size_t nmemb, std::string *buffer_in)
{
// Is there anything in the buffer?
if (buffer_in != NULL)
{
// Append the data to the buffer
buffer_in->append(data, size * nmemb);
// How much did we write?
DownloadedResponse = buffer_in;
return size * nmemb;
}
return 0;
}
Комментарии:
1. У вас есть два вызова
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
Я полагаю, что второй не нужен.2. Также, исходя из моего опыта, кажется, что вам следует присвоить возвращаемое значение curl_slist_append обратно заголовкам, чтобы изменить список.
3. у вас отсутствует вызов
curl_slist_free(headers)
, поэтому этот код пропускает список заголовков4. @PeteKirkham тебе не хватает _ всего. curl_slist_free_all(заголовки);
5. Ваши
curl_slist_append
вызовы ничего не добавляют: вы игнорируете возвращаемое значение.
Ответ №2:
Я думаю, это связано с конфигурацией на HTTP-сервере. Во-первых, вы должны отправлять некоторый тип указания того, какой тип вы ожидаете, например, добавив Accept
заголовок, подобный этому:
Accept: application/json
Если вы не укажете, что вы ожидаете, сервер может вернуть HTML по умолчанию в заголовке ответа Content-Type
, и это то, что curl
говорит вам.
Комментарии:
1. Я пытался добавить следующее, но я не могу получить фактические данные из ответа сервера …. struct curl_slist *headers=NULL; // важно инициализировать значение NULL headers = curl_slist_append(заголовки, «Accept: application/json»); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, заголовки);
Ответ №3:
Вы пробовали этот подход из учебного кода на сайте curl? http://curl.haxx.se/libcurl/c/sepheaders.html
Комментарии:
1. Я хочу прочитать json, не помещая его, есть ли CURLOPT_READHEADER или что-то еще для чтения потока данных, возвращаемых с сервера? кстати, для меня это работает в командной строке curl -i -H «Accept: application / json» -X ПОЛУЧИТЬ web.com/api/json/123