Używam curl, aby uzyskać nagłówki http, aby znaleźć kod statusu http, a także zwrócić odpowiedź. Otrzymuję nagłówki http z poleceniem
curl -I http://localhost
Aby uzyskać odpowiedź, używam polecenia
curl http://localhost
Gdy tylko użyję flagi -I, otrzymuję tylko nagłówki i nie ma już odpowiedzi. Czy istnieje sposób, aby w jednym poleceniu uzyskać zarówno odpowiedź http, jak i nagłówki / kod stanu http?
Odpowiedzi:
Udało mi się uzyskać rozwiązanie, patrząc na dokument curl, który określa, że należy użyć
-
wyjścia, aby uzyskać dane wyjściowe na stdout.Aby uzyskać odpowiedź tylko z kodem powrotu http, mogłem po prostu zrobić
źródło
-i
. A może-v
chcesz też uzyskać dodatkowe informacje.-o -I
kończy się utworzeniem pliku o nazwie dosłownie „-I
” w CWD. Czy ktoś jeszcze to widzi? Rozwiązaniem jest-o/dev/null -I
tryb gadatliwy powie ci wszystko
źródło
Używam tego polecenia, aby wydrukować kod stanu bez żadnego innego wyjścia. Ponadto wykona tylko żądanie HEAD i podąży za przekierowaniem (odpowiednio
-I
i-L
).To bardzo ułatwia sprawdzenie kodu stanu w skrypcie kondycji:
źródło
curl -o -I -L -s -w "%{http_code}" http://localhost
tworzony jest plik o nazwie-I
, aby obejść ten problem, dodałem miejsce na plik wyjściowy sugerowany przez-o
, a mianowicie/dev/null
:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Znalazłem to pytanie, ponieważ chciałem ZARÓWNO odpowiedzi, jak i treści, aby dodać obsługę błędów dla użytkownika.
Możesz wydrukować kod stanu HTTP na standardowe wyjście i zapisać zawartość w innym pliku.
Dzięki temu możesz użyć logiki, aby zdecydować, czy odpowiedź jest warta przetworzenia.
źródło
Ta
-i
opcja jest taka, którą chcesz:Alternatywnie możesz użyć opcji pełnej informacji:
źródło
Użyłem tego:
Aby uzyskać stan HTTP
Aby uzyskać treść odpowiedzi, użyłem tego
źródło
To polecenie
otrzyma treść i status oddzielone przecinkami; możesz je rozdzielić, aby je usunąć.
Możesz zmienić separator, jak chcesz.
źródło
Do zastosowań programistycznych używam:
Pokazuje następujące dane wyjściowe:
źródło
Jest to sposób na pobranie treści „AND” z kodem stanu i sformatowanie go do odpowiedniego pliku json lub innego odpowiedniego formatu. Niektórzy mogą twierdzić, że jest to nieprawidłowe użycie opcji formatu zapisu, ale działa to w przypadku mnie, gdy potrzebuję zarówno treści, jak i kodu stanu w moich skryptach, aby sprawdzić kod stanu i przekazać odpowiedzi z serwera.
uruchom powyższy kod i powinieneś odzyskać json w tym formacie:
z opcją -w write format, ponieważ stderr jest wypisywane jako pierwsze, możesz sformatować swoje dane wyjściowe za pomocą var http_code i umieścić treść odpowiedzi w wartości (body), a następnie wykonać zamknięcie za pomocą var stdout. Następnie przekieruj wyjście stderr na stdout, a będziesz mógł połączyć zarówno kod http, jak i treść odpowiedzi w zgrabne wyjście
źródło
curl: unknown --write-out variable: 'stderr'
curl: unknown --write-out variable: 'stdout'
Mój sposób na osiągnięcie tego :
Aby uzyskać oba (nagłówek i treść), zwykle wykonuję
curl -D- <url>
jak w:Spowoduje to zrzucenie nagłówków (
-D
) do stdout (-
) (szukaj--dump-header
w man curl ).IMHO również bardzo przydatne w tym kontekście:
Często używam jq, aby sformatować dane json (np. Z niektórych pozostałych API). Ale ponieważ jq nie oczekuje nagłówka HTTP, sztuczka polega na wydrukowaniu nagłówków na stderr za pomocą
-D/dev/stderr
. Zauważ, że tym razem używamy również-sS
(--silent, --show-errors) do pomijania wskaźnika postępu (ponieważ piszemy do potoku).Myślę, że może to być również przydatne, jeśli chcesz wydrukować nagłówki (w celu szybkiej kontroli) na konsoli, ale przekierować treść do pliku (np. Gdy jest to jakiś plik binarny, aby nie zepsuć terminalu):
Uwaga: to NIE to samo, co
curl -I <url>
! Jak-I
wykonaHEAD
żądanie, a nieGET
żądanie (szukaj--head
w man curl . Tak: dla większości serwerów HTTP da to ten sam wynik. Ale znam wiele aplikacji biznesowych, które w ogóle nie implementująHEAD
żądania ;-Pźródło
źródło