CURL не выполняет 301 переадресацию, что мне нужно делать? - PullRequest
10 голосов
/ 04 июля 2010

Я использую API CURL c ++ для получения котировок из финансового API Yahoo.Кажется, что curl api и мой код работают нормально, однако я получаю сообщение о перенаправлении «301», когда говорю CURL посетить URL-адрес, который я хочу.Как я могу заставить CURL выполнить перенаправление 301 и получить нужные мне данные?

Вот URL-адрес, который я использую:

http://download.finance.yahoo.com/d/quotes.csv?e=.csv&s=WSF,WSH&f=b2b3s

Вот ответ, который я получаю:

<HEAD><TITLE>Redirect</TITLE></HEAD>
<BODY BGCOLOR="white" FGCOLOR="black">
<FONT FACE="Helvetica,Arial"><B>
 "<em>http://download.finance.yahoo.com/d/quotes.csv?e=.csv&s=WSF,WSH,WSM,WSO,WST,WTI,WTM,WTR,WTS,WTU,WTW,WU,WWE,WWW,WX,WXS,WY,WYN,X,XAA,XCJ,XCO,XEC,XEL,XEL-A,XEL-E,XFB,XFD,XFH,XFJ,XFP,XFR,XIN,XJT,XKE,XKK,XKN,XKO,XL,XL-Y,XOM,XRM,XRX,XVF,XVG,Y,YGE,YPF,YSI,YUM,YZC,ZB-A,ZB-B,ZB-C,ZEP,ZF,ZLC,ZMH,ZNH,ZQK,ZTR,ZZ,ZZC&f=b2b3ccd1d2ghjkk2k3l2l3mm2m3m4m5m6m7m8opst7vw</em>".<p></B></FONT>

<!-- default "Redirect" response (301) -->
</BODY>

Вот мои параметры инициализации CURL

CURL *eh = curl_easy_init();

curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, cb);
curl_easy_setopt(eh, CURLOPT_HEADER, 0L);
curl_easy_setopt(eh, CURLOPT_URL, url);
curl_easy_setopt(eh, CURLOPT_PRIVATE, url);
curl_easy_setopt(eh, CURLOPT_VERBOSE, 0L);

curl_multi_add_handle(cm, eh);

Я не опубликовал свой код, так как он все работает, мне просто нужен общий метод выполнения 301-х.с CURL.

1 Ответ

14 голосов
/ 04 июля 2010

В мире PHP опция называется CURLOPT_FOLLOWLOCATION. Я предполагаю, что имена констант стандартизированы и взяты из одного и того же заголовочного файла, так что это должно работать для вас.

curl_easy_setopt(eh, CURLOPT_FOLLOWLOCATION, 1); 

(или что-то еще в этом контексте "булево").

В качестве альтернативы, при получении кода состояния 30x можно проанализировать заголовок Location вручную для нового адреса. Однако очевидно, что опция «следить за местоположением» намного проще, так как она не требует второго запроса.

...