C语言libcurl库的使用

官方参考资料:

    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 <stdio.h>
#include <curl/curl.h>
#include <string.h>

//输出到字符串再打印到屏幕上
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);数据直接存入自定义的结构体中。

猜你喜欢

转载自blog.csdn.net/FlayHigherGT/article/details/83583201