使用libcurl发送PUT请求上传数据以及DELETE请求删除数据

上篇文章中在对BCS服务器上传下载和删除数据时都使用的是socket函数(有些是我基于socket封装的简单函数),虽然发送请求就应该是这个样子的但上篇文章中是有一个问题的,这个问题就是只能对文本文件进行操作,而对于二进制文件但会出问题,问题的原因是因为数据在本机内存中所存储的方式可能与网络中存储的方式不同,对,这就是字节序问题,因为有些计算机存储的字节序是低端的也就是低位在前高位在后,而网络字节序是高位在前低位在后是高端的,所以这样传输的数据是有问题的,为什么我前篇文章没有对此做处理呢?因为前篇文章中我要做的就是文本文件的操作,记得有一个打印操作吗,显然二进制数据读回来并不能“打印”,所以就没处理这个问题,而要处理这个问题其实也是比较简单的,在上传数据的时候使用htonl或者htons将本机字节序转换为网络字节序再发送,接收的时候使用ntohl或者ntohs将网络字节序转换为本机字节序再存储就算完成了,相应要改动的代码为

将上传部分中的

改为

其中data是一个uint32_t类型的数组,该数组有64个值,至于打印函数,反过来改就是了。

我为什么要说这些呢?这正是本篇文章中程序产生的原因之一。
因为发现了这个问题,我突然发现使用socket函数自己去封装HTTP请求有些太费力了,其实有现成的库让我们使用不是吗,我选择了libcurl。

libcurl是一套很强大的c语言库,用它我们可以简单地完成上面的要求,至少在代码量上比前篇文章中要少得多也方便的多。想要使用libcurl发送PUT请求上传数据我们需要设置这些几个选项

CURLOPT_URL //用它来说明我们要请求的URL
CURLOPT_PUT //它用来说明我们需要使用PUT请求
CURLOPT_READFUNCTION //读取数据的回调函数,用它来读取我们的文件并上传,回调函数的原型是size_t callbackfun(void *ptr,size_t size,size_t nmemb,void *userdata);
CURLOPT_READDATA //指定我们要上传文件的FILE指针
CURLOPT_INFILESIZE //指明我们要上传文件的大小,这个一定要注意,有些文章中用CURLOPT_INFILESIZE_LARGE这个选项,但是我却发现在使用这个选项时上传的数据大小没有被设置,这导致上传的失败

PUT请求方法的选项这是这些,而DELETE请求的方式需要以下选项

CURLOPT_URL //和前面一样
CURLOPT_CUSTOMREQUEST //用它来设置成DELETE请求方式,该选项还可以设置成其它的请求方式,方法是将请求方式以字符串的形式做为curl_easy_setopt函数的第三个参数

一切就是这么简单,下面还是以上传数据到BCS并删除数据为基础,给出libcurl的实现

–阅读次数(48)

发表评论

电子邮件地址不会被公开。

*