在C中使用LIBCURL实现带有承载令牌授权的GET调用

2024-04-25 18:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的程序,使用C中的LIBCURL连接到HTTPS REST服务。为了验证端点,我使用了POSTMAN,GET请求返回了一个成功的响应。REST服务使用承载令牌授权

但是当我用C实现它时,它给了我以下的错误。我使用了邮递员自动生成的代码

* Connected to abcxyz.com (13.224.177.6) port 443 (#0)
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Closing connection 0 curl_easy_perform() failed: SSL connect error

根据我在互联网上的发现,我试着用以下不同的组合,但没有帮助我

curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_NONE);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //only for https
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //only for https
curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST | CURLSSLOPT_NO_REVOKE);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);

这是我的代码片段

CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
  curl_easy_setopt(curl, CURLOPT_URL, "abcxyz.com/v1/service-invenue/configs?keys=SSC_AVAILABLE&keys=SSC_AVAILABLE");
  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
  struct curl_slist *headers = NULL;
  headers = curl_slist_append(headers, "Authorization: Bearer 5065157d2873736ddd726df6678ddh972413");
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  res = curl_easy_perform(curl);

  if(res != CURLE_OK)
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  curl_easy_cleanup(curl);

如果有人能帮我整理我的C程序,我将不胜感激。谢谢

我甚至尝试了等效的python代码,它给出了以下错误(如果这有助于任何人理解问题的话)

File "/python_root/lib/ssl.py", line 601, in __init__
    self.do_handshake()
File "/python_root/lib/ssl.py", line 830, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

邮递员给出的Python代码

import http.client
import mimetypes
conn = http.client.HTTPSConnection("abcxyz.com")
payload = ''
headers = {
  'Authorization': 'Bearer 5065157d2873736ddd726df6678ddh972413'
}
conn.request("GET", "/v1/service-invenue/configs?keys=SSC_AVAILABLE&keys=SSC_AVAILABLE", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

Tags: 代码comsslgeteasyreskeyscurl
1条回答
网友
1楼 · 发布于 2024-04-25 18:00:51

我收到了这段代码的输出…下面是我的代码片段

CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) 
{
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
    curl_easy_setopt(curl, CURLOPT_URL, "https://.....");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Authorization: Bearer .......");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);

相关问题 更多 >

    热门问题