CURL使用

curl用于处理网络请求,接收数据等。我主要用于做客户端。

1. 我使用的是curl静态库,首先是准备工作,代码示例如下:

 

 

CURLcode code; // curl执行返回码
if (mpr_curl == NULL) // curl对象,作为我自定义的类对象的成员变量
{
	CGlbString error;// 自定义字符串对象,继承自string
	// 初始curl化全局变量
	if (code != CURLE_OK)
	{
		GlbSetLastError(L"初始化CURL全局变量失败"); // 自定义函数,保存错误信息,这个是当出现错误时,类对象使用者可以拿到该错误信息
		return NULL;
	}
}
mpr_curl = curl_easy_init();// 初始化该curl对象
if (mpr_curl == NULL)
{
	GlbSetLastError(L"初始化CURL失败");
	return NULL;
} 
code = curl_easy_setopt(mpr_curl, CURLOPT_ERRORBUFFER, g_curlerror_msg);// 设置CURL错误信息缓冲区,g_curlerror_msg为全局变量
if (code != CURLE_OK)
{
	CGlbString errmsg = g_curlerror_msg;  // 拿到错误信息
	GlbSetLastError(errmsg.ToWString().c_str()); // 将错误信息保存
	return NULL;
} 
code = curl_easy_setopt(mpr_curl, CURLOPT_VERBOSE, 1L); // 设置获取意外报告
if (code != CURLE_OK)
{
	CGlbString errmsg = g_curlerror_msg;
	GlbSetLastError(errmsg.ToWString().c_str());
	return NULL;
}
code = curl_easy_setopt(mpr_curl, CURLOPT_FOLLOWLOCATION, 1);// 设置跟随重定向页面
if (code != CURLE_OK)
{
	CGlbString errmsg = g_curlerror_msg;
	GlbSetLastError(errmsg.ToWString().c_str());
	return NULL;
}
// 设置curl接收缓存大小
code = curl_easy_setopt(mpr_curl, CURLOPT_BUFFERSIZE); // 设置缓存大小为
if (code != CURLE_OK)
{
	CGlbString errmsg = g_curlerror_msg;
	GlbSetLastError(errmsg.ToWString().c_str());
	return NULL;
}

 

先前我使用curl时,每次发送请求我都是重新创建curl,后来改进后,上面这个步骤只需要一次就够了,顶多使用下curl的reset函数就可以了,不用多次创建。

2. 下来就是设置curl发送请求的url,以及接收工作。

 

 

// 每次发送请求时,无非就是重新设置请求的url,回调函数(TokenCallback),以及数据处理的对象(token指针)或变量(比如一段内存)
CGlbJsonReaderToken* token= new CGlbJsonReaderToken(); // 此处接收数据的处理我用的是自定义类对象,你也可以传一段内存的指针
code = curl_easy_setopt(curl, CURLOPT_URL, url) ;// 设置url,例如“http://192.168.1.51/xxxx/xxxxx”       
if (code != CURLE_OK)
{
	return false;
}
code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, TokenCallback);//设置回调函数,接收的数据会在回调函数里让你来处理
if (code != CURLE_OK)
{
	return false;
}
code = curl_easy_setopt(curl, CURLOPT_WRITEDATA,  (void*) token);// 设置接收数据的处理对象或变量 
if (code != CURLE_OK)
{
	return false;
}
code = curl_easy_perform(mpr_curl);// 执行请求,该函数调用后,代码会进入TokenCallback这个回调函数里
if (code != CURLE_OK)
{
	return false;
}
glbInt32 retcode = 0;
code = curl_easy_getinfo(mpr_curl, CURLINFO_RESPONSE_CODE , &retcode);
if ( (code == CURLE_OK) && retcode == 200 )
{
	// 进入这里就说明该curl已正常执行
	// 我的回调函数TokenCallback
	// data就是curl接收到的服务器发来的数据,size是数据的个数,nmemb是数据单位大小,content就是当时设置的将要在回调函数里来处理数据对象或内存的指针
}

int  TokenCallback(void *data, int size, int nmemb, void* content)
{
	CGlbJsonReaderToken* token = (CGlbJsonReaderToken*)content; // 这是前面设置的处理接收数据的对象
	int len = size * nmemb;//计算数据长度
	token->Parse(data,len);// 将接收到的数据交给token 对象去处理,我用该对象的parse方法处理数据,具体怎么处理自己看着办
	return len;
}

 

 

 

3. 我使用的是get方式的请求,如果需要用到post方式的话,需要另外设置,网上例子很多。没看懂的可以问我,刚好我可以修正

4. curl接收到的服务器发来的数据,中文出现乱码,服务器方好像用的是utf-8编码,然后转为二进制流发过来的。我使用MultiByteToWideChar(CP_UTF8, 0, str, len, wChar, len)方法可转为正常中文字符。当我的请求中有中文字符时,我发送过去的请求,服务器返回的是错误。原因是我需要将请求中中文字符转为我当时从服务器接收过来的那种乱码的编码格式。使用WideCharToMultiByte(CP_UTF8, 0, srcwstr, -1, pStr, nLen, NULL, NULL)方法就可以,然后就ok了。至于参数具体值自己琢磨吧。

5.发送的请求url在程序中返回错误码400,The request is badly formed.url请求中没有中文字符,但是在浏览器中相同的url就可以返回正确结果。原因是url里面有空格,我把空格转为%20就ok了,请求字符串需要URL编码,这样服务器才能识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值