vs中libcurl和jsoncpp库的简单使用
目录
-
Libcurl
使用libcurl分几个步骤。它分为单线程和多线程,这里用单线程(简单)。本文参考文心一言示例代码进行介绍。
-
初始化
要使用libcurl库,首先需要引入库文件。
#include <curl/curl.h>
初始化创建一个curl对象以便后续操作。
CURL* curl;//创建curl类型的指针,因为函数curl_easy_init()返回的为指向curl结构体的指针
curl = curl_easy_init();//初始化创建一个curl结构体,并返回指向它的指针;初始化失败时会返回null
CURLcode res;//用于存储后续网络操作执行返回的信息便于诊断网络是否连通
在后续的代码编写过程中,可以通过函数curl_easy_setopt()和函数curl_easy_perform()分别进行参数的设置和网络操作的实现。而在执行完各个操作以后,需要使用函数curl_easy_cleanup()将curl资源进行清理,否则将出现各种严重后果。
-
设置参数
设置参数使用函数curl_easy_setopt(),这里只介绍一些基本的参数:
curl_easy_setopt(curl,option,x)
·curl为前面创建的curl结构体指针。
·option为要操作的各个参数。
·x为根据option需要填写的参数。
-关于option参数介绍:
CURLOPT_CUSTOMREQUEST:请求方法,x为字符串(POST/GET)。
CURLOPT_URL:设置要请求的url地址,x类型为字符串。
CURLOPT_HTTPHEADER:设置请求头部,x为curl_list结构体的指针,curl_list是curl中用于存储链表的结构体,通常用于存储http头部信息:
struct curl_slist* headers = NULL; headers=curl_slist_append(headers,"Content-Type:application/json;charset=UTF-8");
其中curl_list_append()的作用为向curl_list中加入头部数据,可以分多次加入:
headers=curl_slist_append(headers,"Content-Type:application/json");
headers=curl_slist_append(headers,"charset=UTF-8");
对于已经存在的头可以重复设置其值,也可将其值设置为空:
headers=curl_slist_append(headers,"Content-Type:application/x-www-form-urlencoded");//重新赋值
headers=curl_slist_append(headers,"Content-Type:");//设置为空
当它不再被需要时,应该使用函数进行清理:curl_slist_free_all(headers)
CURLOPT_POSTFIELDS:要发送的数据,x为要传输的数据,为字符串类型。
CURLOPT_WRITEDATA:一般与下面CURLOPT_WRITEFUNCTION一起使用,用于存储连接后返回的数据,x为字符串类型的指针,可以将服务器返回的数据存入指针指向的字符串变量中。
CURLOPT_WRITEFUNCTION:一般与上面CURLOPT_WRITEDATA一起使用,用于存储连接后返回的数据,x为一个回调函数,这个函数需要自己写,它的格式为:
inline size_t onWriteData(void* buffer, size_t size, size_t nmemb, void* userp)
作用是处理服务器返回的数据,将其存储于你的变量中。其中onWriteData为函数名,buffer为服务器返回的数据,size为单个数据块的大小,nmemb为数据块的数量,userp为你要存储数据的地址指针;它们的名称和变量不是固定的,可以随自己的意愿更改以便于更加精确地处理返回的信息,如下为专门处理返回的为char类型切要存储到string类型变量的声明:
size_t loaddata(char* data, size_t size, size_t num, std::string* localstr)
在curl中还有别的option需要用到回调函数,需要实现具体功能的话可以自己去查。
-
发送请求和数据处理
设置完成参数以后即可开始发送请求:
res = curl_easy_perform(curl);
在执行该函数时前面设置的参数会生效,网络请求返回的结果会被保存到result中,是一段json字符串如果需要方便处理需要下载专门的json库进行处理。函数返回的值可作为连接是否正常进行的依据,如0为正常。
-
总结
上述只是简单介绍一下liburl的用法为后续调用文心一言api做铺垫。想学习详细知识可以访问网站:Curl(C++)使用教程_c++ curl-CSDN博客。
-
Jsoncpp
先声明各个工具变量,声明存储的变量:
Json::Value json_message;//存储json字符串
std::string error;//存储解析错误信息
Json::CharReaderBuilder crbuilder;//创建工程对象,用于设置解析字符的各种方式
//这里程序较为简单,创建它只是为了得到reader用于解析数据
crbuilder["emitUTF8"] = true;//设置json读取时支持utf8编码
std::unique_ptr<Json::CharReader> reader(crbuilder.newCharReader());//创建阅读工具对象
这其中utf8编码可以不设置,json_message可以直接用cout输出来查看其中的成员。
在声明完成后使用parse函数来进行字符串解析:
reader->parse(result.data(), result.data() + result.size(), &json_message, &error);
通过reader将result中的数据解析放在json_message中方便查看,将错误信息存入error。result.data()返回指向result内部数据的指针,指向result的第一位,result.size()返回字符串大小,加上result.data()则指向最后一位字符。现在即可通过json_message来查看各个信息:
std::string answer = json_message["result"].asString();
这里“result”是其中的成员,asString()作用是将读到的数据转化为string类型的。
如果希望更详细的了解jsoncpp可以查阅其他大佬写的文档:c++json库(jsoncpp)简单使用(包含下载使用方法,中文错误解决方案)_json cpp-CSDN博客、JsonCpp 使用指导-菜鸟笔记 (coonote.com)
文章性质为本人学习后做的笔记,如有侵权请联系本人删除。