c++ - 为桌面应用程序发送 http 请求的最佳库是什么

标签 c++ libcurl visual-c++ winhttp proxy-authentication

<分区>

我的应用程序在 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 comm stacks,因为它们在 windows 上更容易操作,并且更容易使用代理(很多时候从机器定义中自动获取他们的配置.

在 Windows 上,它主要是在 WinHTTP 和 WinINet 之间折腾。

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

90% 的时间你可以只使用 Wininet

这是两者之间的完整比较: Microsoft Compare of WinHTTP and WinINet

关于c++ - 为桌面应用程序发送 http 请求的最佳库是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16673664/

相关文章:

c++ - 使用模板类型将参数传递给函数

c++ - 通过套接字发送带有 vector 的 C++ 对象

c++ - libcurl 使用相同的用户定义端口发送定期请求

c++ - 如何嵌入静态库的拷贝?

c++ - 如何在使用 VS2010 的 C++ 编程中的 std::string 中插入复选标记 "✓"

c++ - 如何在这个小的多线程程序中调试死锁

c++ - 使用python在c++文件中查找某个函数的调用

c++ - 为什么在发送几 block 数据后文件上传停止(使用 multipart/form-data)?

c++ - 在 Windows 上使用 libcurl,在我的 c++ 项目中,使用 visual studio,因为字符串被损坏而不起作用

c++ - 未在 lambda 内部调用显式运算符 bool — MSVC 错误?