libcurl.net入门使用
关于libcurl.net
一个引用libcurl.dll
并封装为.NET
使用的Curl
库,方便在.NET
应用程序里面执行Curl
命令,没有其他库依赖,只是对libcurl.dll
的封装和引用。
在大多数情况下,我们可以或者比较容易获取Web请求的Curl
格式的请求内容,因此该库可以比较方便地对已知Curl
命令进行.NET
的程序化转换使用。
安装
因为libcurl
分x86
和x64
版本,因此libcurl.NET
也有两个版本,在Visual Studio
的NuGet
仓库搜索libcurl.NET
,然后根据自己的应用选择安装x86
或x64
对应的版本。
使用流程
-
libcurl
库引用初始化,全局的,整个程序只需要调用一次:
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
- 创建封装的类对象,后续通过该对象执行
Curl
命令:
var easy = new Easy();
- 设置
Curl
参数,包括地址、请求头、请求参数等,统一使用函数easy.SetOpt
,该函数第一个为枚举值的参数类型,第二个参数为对应的参数值:
easy.SetOpt(CURLoption.CURLOPT_USERPWD, UserName + ":" + UserPassword);
easy.SetOpt(CURLoption.CURLOPT_URL, url);
easy.SetOpt(CURLoption.CURLOPT_ENCODING, url);
- 执行
Curl
命令,根据返回代码判定操作结果
var result = easy.Perform();
Log("curl操作完成,结果", pr == CURLcode.CURLE_OK ? "成功" : "失败-" + pr.ToString());
- 销毁封装的类对象
easy.Dispose();
- 释放清理
libcurl
库的引用
Curl.GlobalCleanup();
使用示例
bool TryCurlWithUploadFile(string url)
{
FileStream fs = null;
try
{
// 读取文件
fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
// 需要声明:using SeasideResearch.LibCurlNet;
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
var easy = new Easy();
// 设置网址
easy.SetOpt(CURLoption.CURLOPT_URL, url);
// 设置授权所需的用户名和密码
easy.SetOpt(CURLoption.CURLOPT_USERPWD, UserName + ":" + UserPassword);
// 上传的文件信息
var readFunc = new Easy.ReadFunction(OnReadData);
easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, readFunc);
easy.SetOpt(CURLoption.CURLOPT_READDATA, fs);
easy.SetOpt(CURLoption.CURLOPT_UPLOAD, true);
easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length);
// 可选,显示调试信息
var dbgFunc = new Easy.DebugFunction(OnDebug);
easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, dbgFunc);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true);
// 可选,显示进度
var prgFunc = new Easy.ProgressFunction(OnProgress);
easy.SetOpt(CURLoption.CURLOPT_PROGRESSFUNCTION, dbgFunc);
// 设置不校验SSL
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 0);
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
// 执行命令
var pr = easy.Perform();
if(pr != CURLcode.CURLE_OK)
{
Log("Curl请求失败,原因:", easy.StrError(pr));
}
else
{
Log("Curl请求成功");
}
easy.Dispose();
return true;
}
catch(Exception e)
{
Log("Curl异常:", e.Message);
return false;
}
finally
{
// 清理
fs?.Close();
Curl.GlobalCleanup();
}
}
public Int32 OnReadData(byte[] buf, Int32 size, Int32 nmemb, object ext)
{
var fs = (FileStream)ext;
return fs.Read(buf, 0, size * nmemb);
}
public void OnDebug(CURLINFOTYPE infoType, string message, object extraData)
{
if(infoType == CURLINFOTYPE.CURLINFO_DATA_IN && !string.IsNullOrWhiteSpace(message))
{
Log("Curl<", message);
}
}
public int OnProgress(object extraData, double dlTotal, double dlNow, double ulTotal, double ulNow)
{
Log($"Curl< Progress info: {dlNow}/{dlTotal} {ulNow}/{ulTotal}");
return 0;
}