c ++ libcurl json rest - PullRequest
       5

c ++ libcurl json rest

10 голосов
/ 18 апреля 2011

Я пытаюсь загрузить файл json с веб-страницы REST в C ++ с помощью libcurl.Следующий код работает, если я захожу на веб-страницу, но он не загружается, если я пытаюсь получить доступ к json ....

Я думаю, что это должно быть легко исправить, но я не могу найти ссылку на это ...

Если я захожу на веб-страницу, она открывает JSON, но этот код возвращает только текст / HTML;charset = 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, &ct);
        if((CURLE_OK == res) && ct)
            printf("We received Content-Type: %s\n", ct);
    }
}
/* always cleanup */ 
curl_easy_cleanup(curl);

Ответы [ 3 ]

18 голосов
/ 25 апреля 2011
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, "charsets: 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, &ct);
            if((CURLE_OK == res) && 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 голос
/ 19 апреля 2011

Я думаю, что это связано с конфигурацией на HTTP-сервере.Во-первых, вы должны посылать какой-то тип индикации того, какого типа вы ожидаете, например, добавляя заголовок Accept, например:

Accept: application/json

Если вы не указали, чего ожидаетесервер может вернуть HTML-код по умолчанию в заголовке ответа Content-Type, и именно это curl говорит вам.

0 голосов
/ 19 апреля 2011

Вы пробовали этот подход из учебного кода на сайте curl? http://curl.haxx.se/libcurl/c/sepheaders.html

...