Korzystam curl
z wiersza polecenia w systemie Linux do wysyłania żądań HTTP. Ciała odpowiedzi są wypisywane na standardowe wyjście, co jest w porządku, ale nie widzę na stronie podręcznika, jak uzyskać curl, aby wydrukować kod stanu HTTP z odpowiedzi (404, 403 itp.). czy to możliwe?
797
-i
Flaga, jak wcurl -i https://www.example.com/
, jest prawdopodobnie to, co chcesz, jak na superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Odpowiedzi:
Powinno to działać dla Ciebie, jeśli serwer sieciowy jest w stanie odpowiedzieć na żądania HEAD (nie będzie to możliwe
GET
):Dodatkowo, aby cURL śledził przekierowania (statusy 3xx), dodaj -L.
źródło
curl -I
wykonuje żądanie HEAD HTTP, które może być problematyczne przy testowaniu kodu statusu HTTP dla niektórych serwerów i usług aplikacji WWWhead -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. Dodaj -L, aby zawinąć, jeśli potrzebujesz ostatecznego statusu po przekierowaniach.curl -I -X GET
wyśle żądanie GET, ale da to samo wyjście.Bardziej konkretnym sposobem na wydrukowanie tylko kodu stanu HTTP jest coś w stylu:
O wiele łatwiej jest pracować ze skryptami, ponieważ nie wymaga to żadnej analizy :-)
Ten parametr
-I
można dodać, aby poprawić wydajność ładowania odpowiedzi. Ten parametr tylko żąda statusu / nagłówków odpowiedzi, bez treści odpowiedzi pobierania.Uwaga:
%{http_code}
zwraca pierwszą linię ładunku HTTPto znaczy:
źródło
/dev/null
rzecz działa nawet w wersji Windows curl, której używam.httping -c 1 -s -G -m
wydaje polecenie GET i nie pobiera całego pliku, chociaż zdaję sobie sprawę, że to pytanie dotyczy curl.-s
= Nie pokazuj postępu pobierania,-o /dev/null
= nie wyświetlaj treści,-w "%{http_code}"
= Napisz kod odpowiedzi http na standardowe wyjście po wyjściu.Jeśli chcesz zobaczyć nagłówek, a także wynik, możesz użyć opcji szczegółowej:
Status pojawi się w nagłówku. Na przykład
źródło
Możesz wydrukować kod stanu oprócz wszystkich nagłówków, wykonując następujące czynności:
Dobrą rzeczą
-i
jest to, że również działa-X POST
.źródło
-i
działa z dowolną metodą HTTP, nie tylkoGET
iPOST
... :)-s
(nie pokazuj miernika postępu lub komunikatów o błędach) i-S
(w końcu wyświetlaj komunikaty o błędach)Jeśli chcesz przechwycić kod statusu HTTP w zmiennej, ale nadal przekierować treść do STDOUT, musisz utworzyć dwa STDOUT. Możesz to zrobić za pomocą podstawienia procesu> () i podstawienia polecenia $ () .
Najpierw utwórz deskryptor pliku
3
dla bieżącego procesu „STDOUT za pomocąexec 3>&1
.Następnie użyj
-o
opcji curl, aby przekierować treść odpowiedzi do tymczasowego fifo za pomocą podstawienia polecenia, a następnie w ramach tego zastąpienia polecenia przekieruj dane wyjściowe z powrotem do bieżącego deskryptora pliku STDOUT za3
pomocą-o >(cat >&3)
.Składając wszystko w całość
bash
3.2.57(1)-release
(standard dlamacOS
):Zauważ, że to nie działa,
/bin/sh
jak zauważył SamK w komentarzach poniżej .źródło
STDOUT
, więc powinieneś być w stanie przekierować wyjście z polecenia do dowolnego miejsca, tak jak zwykłe polecenie. Jednak tego nie testowałem.Przedefiniuj wydajność zwijania:
Może być używany z dowolnym rodzajem żądania.
źródło
TYLKO kod statusu
Wszystkie zasługi dla tego GIST
źródło
To bolesne
curl --fail
ograniczenie. Odman curl
:Ale nie ma sposobu, aby uzyskać zarówno niezerowy kod powrotu ORAZ treść odpowiedzi na standardowe wyjście.
W oparciu o odpowiedź pvandenberka i tę inną bardzo przydatną sztuczkę, której nauczyliśmy się na SO , oto obejście:
Ta funkcja zachowuje się dokładnie tak samo
curl
, ale zwróci 127 (kod powrotu nieużywany przezcurl
) w przypadku kodu HTTP z zakresu [400, 600 [.źródło
Spowoduje to wysłanie żądania do adresu URL, pobranie tylko pierwszego wiersza odpowiedzi, podzielenie go na bloki i wybranie drugiego.
Zawiera kod odpowiedzi
źródło
W przypadku żądania POST działały następujące elementy:
źródło
Użyj następującego polecenia cURL i potokuj go, aby grep tak:
Oto, co robi każda flaga:
-I
: Pokaż tylko nagłówki odpowiedzi-s
: Cichy - Nie pokazuj paska postępu-L
: ŚledźLocation:
nagłówkiOto link do kodów stanu HTTP .
Uruchom z wiersza poleceń. Ten curl działa w trybie cichym, podąża za wszelkimi przekierowaniami, pobiera nagłówki HTTP. grep wypisze kod stanu HTTP na standardowe wyjście.
źródło
Spowoduje to zwrócenie następujących informacji:
źródło
Oto niektóre używane polecenie curl,
GET
które zwraca kod HTTP.Pamiętaj, że stosuje się poniższe podejście
HEAD
, które jest szybsze, ale może nie działać dobrze z niektórymi serwerami HTTP mniej zgodnymi z Internetem.źródło
Przykład użycia kodów odpowiedzi. Używam tego, aby ponownie pobrać bazy danych Geolite tylko wtedy, gdy zmieniły się (
-z
), a także następujące przekierowania (-L
):źródło
OP chce poznać kod statusu. Często podczas pobierania pliku chcesz też poczuć jego rozmiar, więc najpierw używam curl, aby wyświetlić kod stanu i rozmiar pliku, a następnie wyłącz pełny i bezpośredni plik do wybranego miejsca i nazwy:
Potem czekam na zakończenie zwijania
zanim uruchomię następne polecenie. Powyższe, gdy jest użyte w skrypcie wielu poleceń takich jak powyżej, daje miłą odpowiedź, taką jak:
Zauważ, że po -o w curl musi następować pełna ścieżka do pliku + nazwa pliku. Pozwala to w ten sposób zapisywać pliki w rozsądnej strukturze nazw, gdy d / l je zwijaj. Zauważ też, że -s i -S użyte razem wyciszają wyjście, ale pokazują błędy. Zauważ też, że -R próbuje ustawić znacznik czasu pliku na taki sam jak w pliku internetowym.
Moja odpowiedź opiera się na tym, co pierwotnie sugerował @pvandenberk, ale dodatkowo faktycznie gdzieś zapisuje plik, zamiast kierować go do / dev / null.
źródło
Podziel zawartość wyjściową
stdout
i kod stanu HTTP nastderr
:Jeśli do stderr pożądany jest tylko kod statusu HTTP,
--silent
można użyć:Żądany strumień można następnie wybrać, przekierowując niechciany strumień do
/dev/null
:Zauważ, że aby drugie przekierowanie działało zgodnie z potrzebami, musimy uruchomić polecenie curl w podpowłoce.
źródło
bash
zastąpienia procesu./tmp/out
/tmp/err
pliki mogą powodować nieoczekiwane wyniki, jeśli zostaną uruchomione równolegle.