【问题标题】:what is the best library to send http request for desktop applications [closed]为桌面应用程序发送 http 请求的最佳库是什么 [关闭]
【发布时间】:2013-05-16 10:28:14
【问题描述】:

我的应用程序在 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,不如发布一个 SSCCE,说明您如何设置和发送 HTTP 请求,看看您遇到的实际问题是否可以解决。
  • 我认为,如果您发布 SSCCE 以及您正在做的事情和获得的结果的大纲,您将更有可能解决您的问题。
  • 这是我第一次听到 sscce 你能发送一个链接来在那里发布我的问题吗?谢谢。我已经向 curl 用户分发列表发送了一封电子邮件,正在等待回复
  • 如果你有 libcurl 问题,你应该在放弃之前使用 curl-library 列表寻求帮助和支持。这就是 libcurl-hackers 闲逛的地方...
  • 很抱歉,欢迎来到 Stackoverflow!我通常包含 this 链接,用于短自包含正确/可编译示例 (SSCCE)。基本上,您将一大段代码缩减为一个展示您正在经历的行为的小示例。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我尝试使用 winhttp 运行示例代码,看起来代理身份验证没有问题。我从来没有用户winhttp。但我更习惯于 libcurl。但是,如果有办法解决代理身份验证问题,那就太好了!!!
  • 我没说有,我只是说WinINet更简单:)看看我发给你的比较链接..
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 2011-01-17
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多