2013-05-21 40 views
0

我的应用程序运行在Windows中,我必须发送一些请求到服务器。我目前正在使用libcurl。什么是最好的库发送HTTP请求的桌面应用程序

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

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

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

下面是使我已经实现代理用法与libcurl中请求

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; 
+1

你指的是什么限制吗?如果认证是通过对证书进行硬编码来实现的,则通过动态地提供证书来工作。而不是仅仅转储libcurl,发布SSCCE关于如何设置和发送HTTP请求的信息,并查看您遇到的实际问题是否可以解决。 –

+0

我认为如果您发布了一份SSCCE和您正在做的事情以及您获得的结果的大纲,您就有更好的机会解决您的问题。 –

+0

这是我第一次听到sscce,你可以发送一个链接在那里发布我的问题。谢谢。如果您有libcurl问题,我已经发送了一封电子邮件来卷曲用户分发列表并等待回复 –

回答

1

做过卷曲的设置,它是可能的,也是最跨平台的解决方案。

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

在Windows上它主要是一个折腾的WinHTTP和的WinINet之间。

  • 的WinINet被认为是更容易和更高级,适合 客户端的访问居多。例如,它会弹出对话框,询问为 代理用户名和密码自动。
  • WinHTTP被认为是非常低的水平,更适合运行多线程的复杂服务器 需要对连接器进行很多控制。时间

90%,你可以使用的Wininet

下面是一个完整两者之间比较: Microsoft Compare of WinHTTP and WinINet

+0

我试着运行一个使用winhttp的示例代码,看起来它没有代理认证的问题,我从来没有用过winhttp,但我更习惯于libcurl,但是如果有办法实现代理认证,将是伟大的东西!!! –

+0

我没有说它确实,我只说WinINet更简单:)看看我给你的比较链接.. –

相关问题