Kod statusu HTTP z libcurl?

92

Jak uzyskać kod statusu HTTP (np. 200 lub 500) po wywołaniu curl_easy_perform?

twk
źródło
7
dobre pytanie. innym mogłoby być, jak uzyskać komunikat o stanie .. :)
mykhal

Odpowiedzi:

135

http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html

CURLINFO_RESPONSE_CODE

Przekaż wskaźnik do long, aby otrzymać ostatni odebrany kod HTTP lub FTP. To
opcja była znana jako CURLINFO_HTTP_CODE w libcurl 7.10.7 i wcześniejszych. To
będzie wynosić zero, jeśli nie otrzymano żadnego kodu odpowiedzi serwera. Zwróć uwagę, że plik
Odpowiedź proxy CONNECT powinna być odczytywana z CURLINFO_HTTP_CONNECTCODE 
a nie to. 
curl_code = curl_easy_perform (session);
long http_code = 0;
curl_easy_getinfo (session, CURLINFO_RESPONSE_CODE, &http_code);
if (http_code == 200 && curl_code != CURLE_ABORTED_BY_CALLBACK)
{
         //Succeeded
}
else
{
         //Failed
}
Vinko Vrsalovic
źródło
6

Druga odpowiedź jest jak najbardziej poprawna, ale chciałbym również dodać, że ręczne sprawdzanie kodu błędu może nie być rozsądne, ponieważ 200kod nie jest jedynym kodem, który oznacza sukces.

Poleciłbym ponownie użyć opcji libcurl CURLOPT_FAILONERROR, która po aktywacji spowoduje, że libcurl rozważy 400i 500statusy kategorii -category zakończy się niepowodzeniem i nie wróci CURLE_OKz wykonywania.

kralyk
źródło
Jako rozszerzenie tego, w zależności od ustawionych opcji, istnieją inne kody inne niż „seria 200”, które są sukcesem, aczkolwiek przy założeniu, że potrzeba więcej pracy. Dwa z najbardziej znanych to 301 i 302. Z pewnością zawijanie może być skonfigurowano je do obsługi automatycznej, ale mogą wystąpić przypadki, w których aplikacja może chcieć obsługiwać je sama. Jedną z możliwości może być sytuacja, gdy protokół https: // jest używany z uwierzytelnianiem klienta, a dla celu wyniku 301/302 potrzebny jest zupełnie nowy łańcuch certyfikatów.
dgnuff