10 Stimmen

c++ libcurl json rest

Ich versuche, eine json-Datei von einer REST-Webseite in C++ mit libcurl herunterladen. Der folgende Code funktioniert, wenn ich auf die Webseite gehe, aber er lädt nicht herunter, wenn ich versuche, auf die json-Datei zuzugreifen ....

Ich denke, es sollte eine einfache Lösung sein, aber ich kann keinen Hinweis darauf finden ...

Wenn ich eine Webseite aufrufe, wird die json-Datei geöffnet, aber dieser Code liefert nur text/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);

21voto

Philip Punkte 569
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, &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;

}

2voto

Diego Sevilla Punkte 27639

Ich denke, das hat mit der Konfiguration des HTTP-Servers zu tun. Zunächst sollten Sie eine Art von Hinweis darauf senden, welchen Typ Sie erwarten, z. B. durch Hinzufügen eines Accept Kopfzeile wie diese:

Accept: application/json

Wenn Sie nicht angeben, was Sie erwarten, kann der Server den Standard-HTML-Code in der Kopfzeile der Antwort zurückgeben Content-Type und das ist es, was curl sagt zu Ihnen.

0voto

holtavolt Punkte 4277

Haben Sie diesen Ansatz anhand des Tutorial-Codes auf der Curl-Website ausprobiert? http://curl.haxx.se/libcurl/c/sepheaders.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X