Згорніть, щоб повернути http-код статусу разом з відповіддю


113

Я використовую curl, щоб отримати заголовки http, щоб знайти код коду http, а також повернути відповідь. Я отримую заголовки http із командою

curl -I http://localhost

Для отримання відповіді я використовую команду

curl http://localhost

Щойно використовую прапор -I, я отримую лише заголовки, і відповіді більше немає. Чи є спосіб отримати як http відповідь, так і код заголовка / http за допомогою однієї команди?


1
Ось дуже корисний сниппет gist.github.com/maxcnunes/9f77afdc32df354883df
rocketspacer

Відповіді:


111

Я зміг отримати рішення, переглянувши документ curl, який вказує використовувати -для виводу, щоб отримати вихід до stdout.

curl -o - http://localhost

Щоб отримати відповідь лише за допомогою http-коду повернення, я міг би просто зробити

curl -o /dev/null -s -w "%{http_code}\n" http://localhost

14
або ви б використали -i. Або, можливо, -vвам також подобається додаткова інформація.
Даніель Стенберг

2
Дякую @DanielStenberg Прийнята відповідь не спрацювала для мене, просто використовуючи -і я працював.
Алехандро Котілья

у вашій другій команді відсутня -I @randominstanceOfLivingThing, хіба що це навмисно порожній варіант? Хоча для мене це не працює
mdo123,

2
-o -Iв кінцевому підсумку створює файл, який називається буквально ' -I' у CWD. Хтось ще бачить це? Рішення для цього-o/dev/null -I
JDS

Вилучено -І. Я зараз помітив і виправив. Вам не потрібен -я.
randomin substanceOfLivingThing


36

Я використовую цю команду для друку коду статусу без будь-якого іншого виводу. Крім того, він буде виконувати лише запит HEAD та слідувати за перенаправленням (відповідно -Iта -L).

curl -o -I -L -s -w "%{http_code}" http://localhost

Це дозволяє дуже легко перевірити код статусу в сценарії охорони здоров’я:

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'

5
На це вже відповіли рік тому. Яку нову цінність приносить ваша відповідь? Будь ласка, напишіть пояснення до своєї відповіді.
Мацей Юречко

11
@MaciejJureczko - цінність проста. Для цілей сценарію ця відповідь найкраща з усіх інших відповідей, оскільки вона дає єдиний код статусу замість багатьох рядків сміття разом із зазначеним кодом статусу.
aggregate1166877

2
Але ОП конкретно заявляє, що вони хочуть і код статусу, і орган відповіді. Вони знають, як просто отримати код відповіді (вказаний у запитанні)
wottle

2
Кожного разу, коли я використовую цей curl -o -I -L -s -w "%{http_code}" http://localhostфайл, створюється названий файл -I, щоб обійти його, я додав місце для виводу файлу, який мається на увазі -o, а саме /dev/null:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Thismatters

HEAD не завжди призводить до того ж результату, що й запит, але до сервера залежить те, як вони відповідають. Тож це насправді не відповідь.
Едді

28

Я знайшов це запитання, тому що я хотів ВІДПОВІСТИТИ відповідь та вміст, щоб додати деякі помилки для користувача.

Ви можете роздрукувати код статусу HTTP, щоб стягнути та записати вміст в інший файл.

curl -s -o response.txt -w "%{http_code}" http://example.com

Це давайте вам використовувати логіку, щоб вирішити, чи варто відповідь обробляти.

http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
    # handle error
else
    echo "Server returned:"
    cat response.txt    
fi

що таке http_code? Я цього не розумію, потрібно більше пояснень, будь ласка
Олександр Міллз

уточнено вище, воно посилається на код статусу HTTP - developer.mozilla.org/en-US/docs/Web/HTTP/Status
Едді

22

Цей -iваріант потрібен:

curl -i http://localhost

-i, - включити заголовки протоколу у висновок (H / F)

Крім того, ви можете скористатися багатослівним варіантом:

curl -v http://localhost

-v, --verbose Зробити операцію більш балакучою


16

Я використав це:

    request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"

Щоб отримати статус HTTP

    http_status=$(echo "$request_cmd" | grep HTTP |  awk '{print $2}')
    echo $http_status

Щоб отримати тіло відповідей, я використав це

    output_response=$(echo "$request_cmd" | grep body)
    echo $output_response

8

Ця команда

 curl http://localhost -w ", %{http_code}"

отримає відокремлене комою тіло та статус; ви можете розділити їх, щоб вийти.

Ви можете змінити роздільник, як вам подобається.


2
хороший натяк! чи можна додати код статусу перед висновком?
Психозой

6

Для програмного використання я використовую наступне:

curlwithcode() {
    code=0
    # Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
    # and sending the content to a file with -o >(cat >/tmp/curl_body)
    statuscode=$(curl -w "%{http_code}" \
        -o >(cat >/tmp/curl_body) \
        "$@"
    ) || code="$?"

    body="$(cat /tmp/curl_body)"
    echo "statuscode : $statuscode"
    echo "exitcode : $code"
    echo "body : $body"
}

curlwithcode https://api.github.com/users/tj

Він показує наступний вихід:

statuscode : 200
exitcode : 0
body : {
  "login": "tj",
  "id": 25254,
  ...
}

5

Це спосіб отримати код статусу "І" і відформатувати його у відповідному json або будь-якому іншому форматі. Деякі можуть стверджувати, що це неправильне використання параметра формату запису, але це працює для мене, коли мені потрібні код тіла та статусу в моїх сценаріях, щоб перевірити код статусу та повернути відповіді з сервера.

curl -X GET -w "%{stderr}{\"status\": \"%{http_code}\", \"body\":\"%{stdout}\"}"  -s -o - https://github.com 2>&1

запустіть код вище, і вам слід отримати json у такому форматі:

{
"status" : <status code>,
"body" : <body of response>
}

з опцією -w формат запису, оскільки stderr надруковано спочатку, ви можете відформатувати свій вихід за допомогою var http_code та розмістити тіло відповіді у значенні (body) та відстежувати додавання за допомогою var stdout. Тоді перенаправіть свій вивід stderr на stdout, і ви зможете об'єднати і http_code, і тіло відповіді в акуратний вихід


1
Отримав таку помилку - curl: unknown --write-out variable: 'stderr'іcurl: unknown --write-out variable: 'stdout'
ALex_hha

curl.haxx.se/docs/manpage.html man page показує змінну, доступну. не впевнений, чому stderr не розпізнається вашою завиткою, curl im на macbook. З цього документу Linux curl doc, computerhope.com/unix/curl.htm , я також не вважаю stderr змінною. Можливо, це варіація ОС.
Хуй Тран

Єдине питання, з яким я маю це, це якщо у вас є цитати, наприклад, якщо його json, тіло зробить відповідь json вище недійсного json
theannouncer

Досить справедливо @theannouncer, я б очікував, що розробник відповідно підкоригується, оскільки не всі відповіді будуть стандартними json. Були деякі випадки, які мені довелося виправити через характер відповіді.
Хуй Тран

2

Мій спосіб досягти цього :

Щоб отримати обидва (заголовок і тіло), я зазвичай виконую curl -D- <url>як:

$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT

{"data":["out.csv"]}

Це дозволить скинути заголовки ( -D) до stdout ( -) (Шукайте --dump-headerв людині curl ).

ІМХО також дуже корисний у цьому контексті:

Я часто використовую jq для отримання даних json (наприклад, від деяких інших API). Але оскільки jq не очікує заголовка HTTP, хитрість полягає в тому, щоб надрукувати заголовки для більш жорсткого використання -D/dev/stderr. Зверніть увагу, що цього разу ми також використовуємо -sS(--silent, - show-помилки) для придушення вимірювача прогресу (тому що ми пишемо в трубу).

$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT

{
  "data": [
    "out.csv"
  ]
}

Я думаю, це також може бути корисним, якщо ви хочете надрукувати заголовки (для швидкого огляду), щоб консолірувати, але перенаправити тіло до файлу (наприклад, коли його якесь двійкове, щоб не зіпсувати ваш термінал):

$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT

Будьте в курсі: це НЕ те саме, що curl -I <url>! Так як -Iбуде виконуватися HEADзапит, а не GETзапит (Шукайте --headв man curl . Так: для більшості серверів HTTP це дасть такий же результат. Але я знаю багато бізнес-додатків, які взагалі не реалізують HEADзапит ;-P


-2
while : ; do curl -sL -w "%{http_code} %{url_effective}\\n" http://host -o /dev/null; done

1
Чому б ти поставив це на певний час? Будь ласка, розгорніть та поясніть свою відповідь.
Uberhumus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.