응답과 함께 http 상태 코드를 반환하는 Curl


113

curl을 사용하여 http 헤더를 가져와 http 상태 코드를 찾고 응답도 반환합니다. 명령으로 http 헤더를 얻습니다.

curl -I http://localhost

응답을 얻으려면 다음 명령을 사용합니다.

curl http://localhost

-I 플래그를 사용하자마자 헤더 만 가져오고 응답은 더 이상 존재하지 않습니다. 하나의 명령으로 http 응답과 헤더 / http 상태 코드를 모두 얻는 방법이 있습니까?


1
다음은 매우 유용한 스 니펫 gist.github.com/maxcnunes/9f77afdc32df354883df
rocketspacer

답변:


111

-출력을 stdout으로 가져 오기 위해 사용하도록 지정하는 curl 문서를보고 솔루션을 얻을 수있었습니다 .

curl -o - http://localhost

http 반환 코드만으로 응답을 얻으려면 다음을 수행하십시오.

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

14
또는 -i. 또는 -v추가 정보가 마음에 들면 아마도 .
Daniel Stenberg

2
@DanielStenberg에게 감사드립니다. 받아 들인 대답은 나를 위해 작동하지 않았으며 단순히 -i 사용하면 작동했습니다.
Alejandro Cotilla

두 번째 명령이 누락되었습니다 -I @randominstanceOfLivingThing, 의도적으로 빈 옵션이 아닌 경우? 그것 없이는 나를 위해 작동하지 않습니다
mdo123

2
-o -I-ICWD에서 문자 그대로 ' ' 라는 파일을 생성합니다 . 다른 사람이 이것을 보나요? 그 해결책은-o/dev/null -I
JDS

-I를 제거했습니다. 나는 지금 눈치 채고 수정했습니다. -I는 필요하지 않습니다.
randominstanceOfLivingThing


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
이것은 이미 1 년 전에 답변되었습니다. 당신의 대답은 어떤 새로운 가치를 가져 오나요? 또한 답변에 대한 설명을 작성하십시오.
Maciej Jureczko

11
@MaciejJureczko-값은 간단합니다. 스크립팅 목적 으로이 답변은 다른 모든 답변 중에서 가장 좋습니다. 왜냐하면 상태 코드와 함께 여러 줄의 쓰레기 대신 단일 상태 코드를 제공하기 때문입니다.
aggregate1166877

2
그러나 OP 는 상태 코드와 응답 본문을 모두 원한다고 구체적으로 명시합니다 . 그들은 응답 코드를 얻는 방법을 알고 있습니다 (질문에 명시)
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는 요청과 항상 동일한 출력을 생성하지는 않지만 서버 응답 방식에 따라 다릅니다. 그래서 이것은 실제로 답이 아닙니다.
Eddie

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는 무엇입니까? 나는 이것을 이해하지 못한다, 더 많은 설명이 필요하다 pls
Alexander Mills

위에서 명확하게 설명하면 HTTP 상태 코드를 참조합니다.- developer.mozilla.org
Eddie 19

22

-i옵션은 당신이 원하는 것을 하나입니다 :

curl -i http://localhost

-i, --include 출력에 프로토콜 헤더 포함 (H / F)

또는 verbose 옵션을 사용할 수 있습니다.

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
좋은 힌트! 출력 앞에 상태 코드를 추가 할 수 있습니까?
Psychozoic

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

이것은 본문 "AND"상태 코드를 검색하고 적절한 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로 출력을 형식화하고 응답 본문을 값 (본문)에 배치하고 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 매뉴얼 페이지는 사용 가능한 변수를 보여줍니다. 왜 stderr가 당신의 컬, 맥북의 컬 임에서 인식되지 않는지 모르겠습니다. 이 Linux curl 문서, computerhope.com/unix/curl.htm 에서 stderr도 변수로 보지 않습니다. 아마도 이것은 OS 변형 일 것입니다.
Huy Tran

내가 가진 유일한 문제는 본문에 따옴표가있는 경우 (예 : json), 본문이 잘못된 json 위에 json 응답을 만들 것입니다
theannouncer

@theannouncer 충분히 공평하게, 모든 응답이 표준 json이 아니므로 개발자가 그에 따라 조정하기를 기대합니다. 응답의 특성상 조정해야하는 경우가있었습니다.
Huy Tran

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 ( -)으로 덤프합니다 ( man curl--dump-header 에서 찾으 십시오 ).

IMHO는 또한이 맥락에서 매우 편리합니다.

나는 종종 jq 를 사용 하여 json 데이터 (예 : 일부 나머지 API에서)를 형식화합니다. 그러나 jq는 HTTP 헤더를 기대하지 않기 때문에 트릭은를 사용하여 헤더를 stderr에 인쇄하는 것 -D/dev/stderr입니다. 이번에는 -sS(--silent, --show-errors)를 사용하여 진행률 표시기를 억제합니다 (파이프에 쓰기 때문에).

$ 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사람 컬 대부분의 HTTP 서버의 경우이 같은 결과를 얻을 것입니다하지만 구현하지 않는 비즈니스 응용 프로그램을 많이 알고있다. 예. HEAD모든 ;-P에서 요청을


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

1
왜 이것을 while 루프에 넣습니까? 답을 확장하고 설명하십시오.
Uberhumus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.