2014-02-06 54 views
2

我目前正在開發一個需要使用C來製作http獲取請求的項目。我正在嘗試使用curl來做到這一點。但是,我收到的回覆是:使用C中的卷積不支持的協議

error: unable to request data from https://coinex.pw/api/v2/currencies: 
Unsupported protocol 

我不確定錯誤是來自curl還是來自服務器。這裏是我的代碼,借用示例代碼:

#include <curl/curl.h> 

static char *request(const char *url) 
{ 
CURL *curl = NULL; 
CURLcode status; 
struct curl_slist *headers = NULL; 
char *data = NULL; 
long code; 

curl_global_init(CURL_GLOBAL_ALL); 
curl = curl_easy_init(); 
if(!curl) 
    goto error; 

data = malloc(BUFFER_SIZE); 
if(!data) 
    goto error; 

struct write_result write_result = { 
    .data = data, 
    .pos = 0 
}; 

curl_easy_setopt(curl, CURLOPT_URL, url); 

headers = curl_slist_append(headers, "Content-type: application/json"); 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result); 

status = curl_easy_perform(curl); 
if(status != 0) 
{ 
    fprintf(stderr, "error: unable to request data from %s:\n", url); 
    fprintf(stderr, "%s\n", curl_easy_strerror(status)); 
    goto error; 
} 

curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); 
if(code != 200) 
{ 
    fprintf(stderr, "error: server responded with code %ld\n", code); 
    goto error; 
} 

curl_easy_cleanup(curl); 
curl_slist_free_all(headers); 
curl_global_cleanup(); 

/* zero-terminate the result */ 
data[write_result.pos] = '\0'; 

return data; 

error: 
if(data) 
    free(data); 
if(curl) 
    curl_easy_cleanup(curl); 
if(headers) 
    curl_slist_free_all(headers); 
curl_global_cleanup(); 
return NULL; 
} 

任何提示/提示是值得歡迎的。

回答

8

curl(和libcurl)當它們無法解釋URL的協議部分時會提供不受支持的協議錯誤。在你的情況下,這意味着https:,這有點奇怪。

首先檢查您是否可以使用命令行中的curl工具來檢索URL。

curl -V會給你的協議curl(因此libcurl)的列表將支持:

$ curl -V 
curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP 

檢查https是存在的。這可能是因爲您的libcurl不是針對SSL庫構建的,或者是未安裝SSL庫。

終於在這個頁面上:http://curl.haxx.se/libcurl/c/example.html你會注意到這是一個簡單的https例子(第二個下來)。請確認該軟件適用於您的libcurl。如果是這樣,我會發現你的程序在做什麼不同。如果不是,我會發現你的libcurl安裝有什麼問題。

+0

安裝curl後我安裝了open ssl。我重拍捲曲,它的作品。謝謝。 –

-3

嘗試在您的網址中使用「http」,但使用「https」。

+0

答案有幾個問題。 1.它會創建未加密的連接到服務器,這是不理想的,可能不需要。 2.並非所有服務器都允許未加密的HTTP連接。 –