응답과 함께 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.