为桌面应用程序发送HTTP请求的最佳库是什么?



我的应用程序在Windows中运行,我必须向服务器发送一些请求。我正在使用libcurl.

但是,当在请求发送到服务器之前涉及具有身份验证的代理服务器时,存在一个限制。

我探索了libcurl中的选项,但我无法使它工作。如果我硬编码用户名/密码,它工作。但是我不想通过我的应用程序获得用户名和密码;我希望libcurl可以在传输开始时请求这些。

是否有一个不同的库,我可以使用像winhttp或libcurl是最好的一个使用?

下面是在请求

之前完成的curl设置
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_URL, urlString.data());
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, receiveDataCallback);
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, &curlPerformStorage);
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_FOLLOWLOCATION, 1);
if(NULL != GetWindowsProxyConfig().lpszProxy){
    LPWSTR wStr = GetWindowsProxyConfig().lpszProxy;
    char* buffer = new char[100];
    wcstombs(buffer, wStr, 100) ;
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXY, "<proxy_name>");
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXYPORT, <number>);
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_NONE);
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
} else {
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXY, "<proxy_name>");
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXYPORT, <number>);
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
}
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_USE_SSL, CURLUSESSL_ALL);
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 1);
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
if(proxyStr.length() > 0){
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_HTTPPROXYTUNNEL, 1L);
}
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_FAILONERROR, 1);
curlResultCode= curl_easy_setopt ( curlHandle, CURLOPT_ERRORBUFFER, errorbuffer );
int nConnectionTimeout = curlPerformStorage.GetConnectionTimeOut();
if (nConnectionTimeout > 0)
{
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_CONNECTTIMEOUT, nConnectionTimeout);
}
int nTransferTimeout = curlPerformStorage.GetTransferTimeOut();
if (nTransferTimeout > 0)
{
    curlResultCode=curl_easy_setopt(curlHandle, CURLOPT_TIMEOUT, nTransferTimeout);
}
curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_PROGRESSFUNCTION , ProgressCallback);
if (curlResultCode == CURLE_OK)
{
    curlResultCode = curl_easy_setopt(curlHandle, CURLOPT_NOPROGRESS, FALSE);
    curlResultCode= curl_easy_setopt(curlHandle, CURLOPT_PROGRESSDATA , &curlPerformStorage);
}
curlResultCode = curl_easy_perform(curlHandle);
if (curlResultCode != CURLE_OK)
{
}
else
{
}
curl_easy_reset(curlHandle);
return curlResultCode;

我已经用libcurl实现了代理用法,这是可能的,也是最跨平台的解决方案。

话虽如此,在Windows上,你最好的选择是坚持使用Windows通信栈,因为它们在Windows上更容易操作,并且更容易与代理一起工作(很多时候从机器定义中自动获取配置)。

在windows上,它主要是在WinHTTP和WinINet之间切换。

  • WinINet被认为更简单,更高级,适合客户端访问最多。例如,它会弹出一个对话框,询问a代理用户名和密码自动设置
  • WinHTTP被认为是非常低级的,更适合于运行多线程的复杂服务器,需要对连接进行大量控制。

90%的情况下你可以直接使用Wininet

下面是两者的完整比较:WinHTTP与WinINet的Microsoft比较

相关内容

  • 没有找到相关文章

最新更新