Просто простой тест загрузки файла. Не работает. Вероятно, из-за прокси в компании. Как мне настроить прокси? Перед добавлением «127.0.0.1:8080» я всегда получал ошибку 7: не удалось подключиться к серверу. Теперь я всегда получаю код возврата 0, но тестовый файл json.txt содержит только 404. Но URL-адрес, очевидно, работает в моем браузере. Я также пытался получить настройки прокси из системы через это, но я потерпел неудачу.
HTTP/1.1 404 Not Found
Connection: Keep-Alive
Server: Embedthis-http
ETag: "0-0-56d6b6ea"
Cache-Control: no-cache
Last-Modified: Wed, 02 Mar 2016 09:48:26 GMT
Date: Fri, 19 May 2017 14:33:57 GMT
Content-Length: 167
Keep-Alive: timeout=60, max=199
<!DOCTYPE html>
<html><head><title>Not Found</title></head>
<body>
<h2>Access Error: 404 -- Not Found</h2>
<pre>Cannot locate document: /</pre>
</body>
</html>
Вот моя попытка cURL:
CURL *curl;
FILE *fp;
char url[] = "http://www.carqueryapi.com/api/0.3/?callback=?&cmd=getMakes&year=2010&sold_in_us=1";
char outfilename[FILENAME_MAX] = "C:\\temp\\json.txt";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url );
curl_easy_setopt(curl, CURLOPT_NOBODY, true);
curl_easy_setopt(curl, CURLOPT_HEADER, true);
curl_easy_setopt(curl, CURLOPT_HTTPGET, true);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:8080" );
res = curl_easy_perform(curl);
cout << "Curl response code " << res << ": " << curl_easy_strerror( res ) << endl;
curl_easy_cleanup(curl);
fclose(fp);
}
ОБНОВИТЬ
В настройках Интернета настроено использование файла wpad.dat
для обнаружения прокси. Если я ввожу один из них, я получаю ответ от сервера, но он говорит, что доступ запрещен, потому что веб-сайт заблокирован. Но мой браузер может отображать этот сайт.
Напротив, если я ввожу netsh.exe winhttp show proxy
, он говорит, что текущие настройки прокси-сервера winhttp - «прямой доступ (без прокси-сервера)».
ОБНОВЛЕНИЕ 2
Наконец-то я заставил его работать с этими параметрами: использовал Verbose
, чтобы получить более полезный результат; вывод показал некоторые методы аутентификации, такие как negotiate
и ntlm
; параметр ntlm
не работал, но negotiate
one вместе с userpwd :
, который принимает учетные данные из системы, если libcurl имеет модуль sspi.
curl_easy_setopt(curl, CURLOPT_URL, url );
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1 );
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY );
curl_easy_setopt(curl, CURLOPT_PROXY, <"host:port"> );
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NEGOTIATE );
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, ":" );