#include <curl/curl.h> | |
#include <string> | |
size_t writeFunction(void *ptr, size_t size, size_t nmemb, std::string* data) { | |
data->append((char*) ptr, size * nmemb); | |
return size * nmemb; | |
} | |
int main(int argc, char** argv) { | |
auto curl = curl_easy_init(); | |
if (curl) { | |
curl_easy_setopt(curl, CURLOPT_URL, "https://api.github.com/repos/whoshuu/cpr/contributors?anon=true&key=value"); | |
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); | |
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:pass"); | |
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.42.0"); | |
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L); | |
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L); | |
std::string response_string; | |
std::string header_string; | |
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction); | |
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string); | |
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_string); | |
char* url; | |
long response_code; | |
double elapsed; | |
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); | |
curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &elapsed); | |
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); | |
curl_easy_perform(curl); | |
curl_easy_cleanup(curl); | |
curl = NULL; | |
} | |
} |
this worked for me (using the global init and cleanup was needed):
#include <iostream>
#include <curl/curl.h>
#include <string>
using namespace std;
size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) {
data->append((char*)ptr, size * nmemb);
return size * nmemb;
}
int main(int argc, char** argv) {
curl_global_init(CURL_GLOBAL_DEFAULT);
auto curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
std::string response_string;
std::string header_string;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_string);
curl_easy_perform(curl);
cout << response_string;
curl_easy_cleanup(curl);
curl_global_cleanup();
curl = NULL;
}
}
I had to change "size_t writeFunction" to "static size_t writeFunction" in order to stop getting the following error: "non-standard syntax; use '&' to create a pointer to member"; however, aside from that, this example is working perfectly.
On linux systems you can build the example with g++ -o curl_get curlget.cpp -lcurl
Small note, if you want to get proper values in
url
,response_code
andelapsed
you need call curl_easy_getinfo methods aftercurl_easy_perform(curl);
yep it did
If curl_easy_perform
fails with the code CURL_SSL_CACERT
, consider adding curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE)
, but beware this makes your app less secure, and the proper solution is to set CURLOPT_CAINFO
Suggest you switch the condition, writing:
if (not curl) { exit 1; } // or EXIT_FAILURE
so the rest of the code doesn't need the indentation and our brain stack can be empty.
Small note, if you want to get proper values in
url
,response_code
andelapsed
you need call curl_easy_getinfo methods aftercurl_easy_perform(curl);