2013-05-21 2 views
0

Мое приложение работает в Windows, и мне нужно отправить некоторые запросы на сервер. В настоящее время я использую libcurl.какая самая лучшая библиотека для отправки http-запроса для настольных приложений

Однако существует ограничение, когда прокси-сервер с аутентификацией задействован перед отправкой запроса на сервер.

Я изучил варианты в libcurl, но я не смог заставить его работать. Если я жестко задаю имя пользователя/пароль, он работает. Но я не хочу получать имя пользователя и пароль по моему приложению; Я бы предпочел, чтобы libcurl мог запросить их в начале передачи.

Есть ли другая библиотека, которую я могу использовать, например winhttp или 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, вы можете отправить ссылку, чтобы опубликовать мой вопрос. Благодарю. Я уже отправил электронное письмо для зависания списка рассылки пользователей и ожидая ответа –

ответ

1

Я реализовал прокси использований с Libcurl, возможно, и является наиболее кросс решения платформы.

Сказав, что в Windows лучше всего придерживаться стеков сокетов Windows, поскольку их легче будет обрабатывать на окнах, и будет проще работать с прокси (много раз получая их конфигурацию из определений машины автоматически.

на окнах его основном бросок между WinHTTP и WinINet.

  • WinINet считается более легким и более высокий уровень, подходит для клиентов доступ главным образом. Например, он будет всплывающее окно с просьбой для прокси-имя пользователя и пароль автоматически.
  • WinHTTP считается очень низким и более подходит для очень сложных серверов, работающих многопоточно, где вам нужно много контроля над conneciton.

90% времени, вы можете просто использовать Wininet

Здесь полное сравнение между двумя: Microsoft Compare of WinHTTP and WinINet

+0

Я попытался запустить образец кода, используя winhttp, похоже, что у него нет проблемы с прокси-аутентификацией. У меня никогда не было winhttp-пользователя. Но я больше привык к libcurl. Однако, если есть способ обойти аутентификацию прокси-сервера, было бы что-то отличное !!! –

+0

Я этого не говорил, я только сказал, что WinINet проще :) посмотрите на ссылку сравнения, которую я вам отправил .. –

 Смежные вопросы

  • Нет связанных вопросов^_^