C语言中使用Curl时出现的不支持协议问题

3

我目前正在从事一个需要使用C语言发起HTTP Get请求的项目。我尝试使用curl来实现这个功能。但是,我收到了一个回复,内容如下:

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;
}

欢迎提供任何技巧/提示。
2个回答

11

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安装有什么问题。


我在安装curl之后安装了open ssl。我重新制作了curl,现在它可以正常工作了。谢谢。 - Gregory-Turtle

-8
尝试在您的URL中使用“http”而不是“https”。

3
你的回答存在几个问题。
  1. 它将创建未加密的连接到服务器,这不理想且可能不被允许。
  2. 并非所有服务器都允许未加密的HTTP连接。
- Phitherek_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接