我正在尝试从private
GitHub资源库下载一个文件,当前代码:
#include <curl/curl.h>
static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp) {
size_t realsize = size * nmemb;
auto& mem = *static_cast<std::string*>(userp);
mem.append(static_cast<char*>(contents), realsize);
return realsize;
}
void Download(std::string& data, char* url)
{
CURL* curl_handle;
CURLcode res;
struct curl_slist* slist{};
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
SecureZeroMemory(url, strlen(url));
slist = curl_slist_append(slist, "Authorization: token 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");
slist = curl_slist_append(slist, "Content-Type: application/json");
curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, slist);
curl_easy_setopt(curl_handle, CURLOPT_TCP_KEEPALIVE, 0);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &data);
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); // redirects
//curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); // only to debug
res = curl_easy_perform(curl_handle);
if(res != CURLE_OK)
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << '\n';
curl_easy_cleanup(curl_handle);
curl_global_cleanup();
}
int main(int argc, char* argv[]) {
std::string data;
Download(data, /* link */);
}
这是下载到data
的内容:
<!DOCTYPE html>
<html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system">
<head>
<meta charset="utf-8">
<link rel="dns-prefetch" href="https://github.githubassets.com">
<link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
<link rel="preconnect" href="https://github.githubassets.com" crossorigin>
<link rel="preconnect" href="https://avatars.githubusercontent.com">
...
我想问题出在设置授权令牌上,我也试过了:
slist = curl_slist_append(slist, "Authorization: Bearer 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");
slist = curl_slist_append(slist, "Content-Type: application/json");
2条答案
按热度按时间xpszyzbs1#
添加授权和接受标头,如下所示:
则呼叫了
并以以下形式提供指向该文件的链接:
eaf3rand2#
您应该包括以下行
否则,在请求中根本不会使用您精心创建的头列表,并且根本不会传输任何身份验证令牌。
此外,由于您使用的是GET请求,因此标头
没有任何意义
就足够了(我非常希望这不是您的实际令牌!如果是,请迅速使其无效并生成一个新令牌!)。