官方参考资料:
https://curl.haxx.se/libcurl/c https://curl.haxx.se/libcurl/c/example.html
下面咱用curl的c语言代码库来实现下面命令行,这是获取同样的返回。其中加入了-d post数据以及-k -v参数。
命令行:
curl -k -d -v "username=root@pam&password=nicaiba_88" https://192.168.112.3:8006/api2/json/access/ticket
结果:
下面代码实现了请求,并且将返回输出到了屏幕上,代码里面也可以将输出写入文件,可以自行打开注释选择输出到文件还是屏幕上。
代码实现:
#include
#include
#include
//输出到字符串再打印到屏幕上
ssize_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
strcat(stream, (char *)ptr);
puts(stream);
return size*nmemb;
}
//输出到文件
ssize_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
int main(int argc, char *argv[])
{
CURL *curl2;
CURLcode res2;
//FILE *fp2;
//struct curl_slist *list=NULL;
//list = curl_slist_append(list, argv[1]);//这个其实是-H但是这边没用到所以注释
//list = curl_slist_append(list, argv[2]);//有几个-H头就append几次
static char str[20480];
res2 = curl_global_init(CURL_GLOBAL_ALL);
curl2 = curl_easy_init();
if(curl2)
{
//fp2=fopen("UsefullInfo.json", "w+");
curl_easy_setopt(curl2, CURLOPT_URL, "https://192.168.112.3:8006/api2/json/access/ticket");//这是请求的url
curl_easy_setopt(curl2, CURLOPT_POSTFIELDS, "username=root@pam&password=nicaiba_88");//这是post的内容
//curl_easy_setopt(curl2, CURLOPT_HTTPHEADER, list);//若需要带头,则写进list
curl_easy_setopt(curl2, CURLOPT_SSL_VERIFYPEER, 0);//-k
curl_easy_setopt(curl2, CURLOPT_SSL_VERIFYHOST, 0);//-k
curl_easy_setopt(curl2, CURLOPT_VERBOSE, 1);//这是请求过程的调试log
curl_easy_setopt(curl2, CURLOPT_WRITEFUNCTION, write_data);//数据请求到以后的回调函数
curl_easy_setopt(curl2, CURLOPT_WRITEDATA, str);//选择输出到字符串
//curl_easy_setopt(curl2, CURLOPT_WRITEDATA, fp2);//选择输出到文件
res2 = curl_easy_perform(curl2);//这里是执行请求
curl_easy_cleanup(curl2);
//fclose(fp2);
}
curl_global_cleanup();
return 0;
}
保存为test.c,编译:gcc test.c -lcurl 后直接执行。
到这边一般来说已经可以了,收集数据的时候如果想更加周全一点的话,使用以下方式,比较有可能数据很长很长。
struct memory_struct
{
char *memory;
size_t size;
};
size_t curl_get_virt_info(void *ptr, size_t size, size_t nmemb, void *userp)//存入文件的函数
{
size_t real_size = size*nmemb;
struct memory_struct *mem = (struct memory_struct *)userp;
mem->memory = realloc(mem->memory, mem->size+real_size + 1);
if(mem->memory == NULL)
{
return 0;
}
memcpy(&(mem->memory[mem->size]), ptr, real_size);
mem->size += real_size;
mem->memory[mem->size] = 0;
return real_size;
}
struct memory_struct chunk;
chunk.size = 0;
chunk.memory = malloc(1);
//下面两句替换掉,回调函数也改一下
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_get_virt_info);
url_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);数据直接存入自定义的结构体中。
后面还是用到了怎么去获取http的状态码,很简单:
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
//中间一个参数可以参照libcurl c api去查看可以解析http头信息
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
if (response_code == 401) {
M_DEBUG("We received response_code == 401\n");
net_res->error_msg = strdup("用户名密码验证失败(401)");
}
}