简体   繁体   English

时间:2019-05-16 标签:c++libcurljsonrest

[英]c++ libcurl json rest

I am trying to download a json file from a REST webpage in C++ with libcurl.我正在尝试使用 libcurl 从 C++ 中的 REST 网页下载 json 文件。 The following code works if I go to the webpage but it doesnt download if I try to access the json ....如果我转到网页,以下代码有效,但如果我尝试访问 json 则不会下载....

I think it should be an easy fix but I cant find any reference to this ...我认为这应该是一个简单的解决方法,但我找不到任何对此的参考......

If I go to webpage it opens the json but this code only returns text/html;如果我转到网页,它会打开 json,但此代码仅返回 text/html; charset=utf-8字符集=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);
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;

}   

I think this has to do with the configuration on the HTTP server.我认为这与 HTTP 服务器上的配置有关。 First, you should be sending some type of indication of what type you're expecting, for example, adding an Accept header like this:首先,您应该发送某种类型的指示,表明您期望的是什么类型,例如,添加一个Accept标头,如下所示:

Accept: application/json

If you don't specify what you're expecting, the server may return the default HTML in the response header Content-Type , and that's what curl says to you.如果您没有指定您期望的内容,服务器可能会在响应头Content-Type返回默认的 HTML,这就是curl

Have you tried this approach from the tutorial code at the curl site?您是否从 curl 站点的教程代码中尝试过这种方法? http://curl.haxx.se/libcurl/c/sepheaders.html http://curl.haxx.se/libcurl/c/sepheaders.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM