curl을 사용하여 HTTP POST에서 응답 헤더 만 가져 오기


561

의 옵션 -I으로 HTTP HEAD를 사용하여 헤더 만 요청할 수 있습니다 curl(1).

$ curl -I /

긴 HTML 응답 본문은 명령 줄에 들어가는 데 어려움이 있으므로 POST 요청에 대한 피드백으로 헤더 만 가져오고 싶습니다. 그러나 HEAD와 POST는 서로 다른 두 가지 방법입니다.

POST 요청에 응답 헤더 만 표시하도록 curl을 얻으려면 어떻게해야합니까?

답변:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

맨 페이지에서. 그래서

curl -sSL -D - www.acooke.org -o /dev/null

리디렉션을 따르고 헤더를 stdout에 덤프하고 데이터를 / dev / null로 보냅니다 (POST가 아닌 GET이지만 POST를 사용하여 동일한 작업을 수행 할 수 있음-POST 데이터에 이미 사용중인 옵션 만 추가)

주의 --D출력 "파일이"표준 출력임을 나타냅니다.


22
위의 주석은 powershell을 사용하는 경우 유효합니다. cmd.exe 사용curl -s -D - http://yahoo.com -o nul
JJS

1
@JJS for $ null은 Win7에서 일했습니다. Windows에 cLink가 설치되어 있기 때문입니다.
Satya Prakash

17
URL 앞에있는 "-"는 중요하지 않은 것처럼 보일 수 있지만 그렇지 않습니다.
Wahid Sadik

1
@WahidSadik 왜 그런 경우입니까? 단일 대시의 기능은 무엇입니까?
mamachanko

4
@mamachanko -D는 출력이 어디로 가야하는지에 대한 인수를 취합니다. 단일 대시는 stdout으로 이동해야 함을 의미합니다.
Andrew cooke

172

다른 답변에는 응답 본문을 다운로드해야합니다. 그러나 헤더 만 가져 오는 POST 요청을 만드는 방법이 있습니다.

curl -s -I -X POST http://www.google.com

-I자체에 의해 대체 될 수있는 HEAD 요청 수행 -X POST후 (또는 다른) 요청을 수행하고, 여전히 상기 헤더 데이터를 얻을 수있다.


15
웹 서버가 요청 방법에 따라 다른 헤더를 반환 할 수 있기 때문에이 답변은 실제로 정확합니다. GET에서 헤더를 확인하려면 GET 요청을 사용해야합니다.
chhantyal

6
내 의견으로는 이것이 가장 정답입니다. 기억하기 쉽고 실제로 GET요청을 보내고 전체 응답 본문을 다운로드하지 않습니다 (또는 적어도 출력하지 않습니다). -s플래그도 필요하다.
skozin

@JeffPuckettII 잘 좀 nitpicking 말할 것입니다. 당신은 대체 할 수 GET와 함께 POST위의 명령과 예상대로 작동합니다. or any other핵심입니다.
chhantyal

18
실제로 POST일부 데이터를 원할 때는 작동하지 않습니다 . 컬 말한다 :Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt 여기서 중요한 점은 서버가 POST 또는 GET 요청과 HEAD 요청에 다르게 응답 할 수 있으며 (일부 서버에서는 실제로 그렇게 함) -X HEAD신뢰할 수있는 솔루션이 아니라는 것입니다.
siracusa

58

다음 명령은 추가 정보를 표시합니다

curl -X POST http://httpbin.org/post -v > /dev/null

전체 응답 대신 HEAD 만 보내도록 서버에 요청할 수 있습니다.

curl -X HEAD -I http://httpbin.org/

Note:경우에 따라 서버는 게시 및 HEAD에 대해 다른 헤더를 보낼 수 있습니다. 그러나 거의 모든 경우 헤더는 동일합니다.


5
정답이기 때문에 다른 답변이 이겼다는 것은 불행한 일입니다. 불필요하게 많은 양의 데이터를 전송하지는 않습니다.
Daniel

1
@dmd cURL 매뉴얼을 -X, --request올바르게 이해하면 -X HEAD여전히 " tton of data"가 발생하지만 -I, --head예상 한 결과 가 발생합니다.
Daniel AR Werner

1
당신은 그것을 올바르게 이해하지 못합니다. -X HEAD-I정확히 동일합니다.
Daniel

18
문제 -X HEAD는 서버가 이제 (또는 이전 요청이던 무엇이든) HEAD요청을 받기 때문에 다르게 응답 할 수 있다는 것입니다.GET
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian

53

긴 응답 본문 (및 기타 유사한 상황)의 경우 내가 사용하는 솔루션은 항상 파이프에 연결하는 less것이므로

curl -i https://api.github.com/users | less

또는

curl -s -D - https://api.github.com/users | less

일을 할 것입니다.


이들은 동일 하지 않습니다 . 첫 번째는 HEAD많은 서버가 다르게 응답 하는 요청을 발행합니다 . 두 번째 GET는 우리가 찾고있는 것과 더 유사한 요청을 발행합니다 .
glasz

25

어쩌면 그것은 약간의 극단적이지만, 나는이 슈퍼 짧은 버전을 사용하고 있습니다 :

curl -svo. <URL>

설명:

-v 디버그 정보 인쇄 (헤더 포함)

-o.웹 페이지 데이터 (무시하고자하는)를 특정 파일 ( .이 경우 디렉토리이며 유효하지 않은 대상이며 출력을 무시하도록 함)로 보냅니다.

-s진행률 표시 줄 없음, 오류 정보 없음 (그렇지 않으면 Warning: Failed to create the file .: Is a directory)

경고 : 결과는 항상 실패합니다 (연결 가능 여부에 관계없이 오류 코드 측면에서). 쉘 스크립팅에서 조건문에 사용하지 마십시오.


1
-o.대신에 사용 -o /dev/null합니까?
bfontaine

@bfontaine -o.-o /dev/null간결함을 위해 사용 되었습니다
exebook

그것은 같은 행동을하지 않으므로 8 문자를 저장하기 위해 그것을 사용하는 것은 이상합니다.
bfontaine

2
@ bfontaine 가장 올바른 방법을 수행하는 방법을 보여주는 다른 답변이 있습니다. 이것은 기본적으로 동일한 일을하는 짧은 대안을 보여주기 위해 여기 있습니다.
exebook

이 명령이 항상 실패 한다는 대답을 명확하게해야 합니다. make 가 0이 아닌 (= 오류) 코드를 반환 하기 때문에 curl -svo. <url> && echo foo인쇄되지 않습니다 : . foo-o.curlcurl: (23) Failed writing body
bfontaine


14

다른 답변은 모든 상황에서 나에게 도움이되지는 않지만 여기서 찾을 수있는 최선의 해결책 POST다음과 같습니다.

curl -vs 'https://some-site.com' 1> /dev/null


1
이 작업을 수행하려면 따옴표 사이에 URL을 넣어야했습니다.
Christophe Weis

1
이것이 필요한지 아닌지는 URL과 사용 된 쉘에 따라 달라질 수 있습니다. 이에 따라 답변을 개선했습니다. 감사.
Daniel AR Werner

3

headcurl.cmd (Windows 버전)

curl -sSkv -o NUL %* 2>&1
  • 진행률 표시 줄을 원하지 않습니다 -s.
  • 그러나 나는 오류를 원한다 -S.
  • 유효한 HTTPS 인증서에 대해 귀찮게하지 -k,
  • 높은 세부 정보 표시 -v(문제 해결에 관한 것입니까?)
  • 깨끗한 방법으로 출력되지 않습니다.
  • 오, 그리고 stderrstdout 으로 전달 하고 싶습니다 . 따라서 모든 것에 대해 grep 할 수 있습니다 (대부분 또는 모든 출력이 stderr에 오므로)
  • %*는 [이 스크립트에 모든 매개 변수를 전달] (well ( https://stackoverflow.com/a/980372/444255 )을 의미합니다. 일반적으로 테스트하는 URL 중 하나입니다.

실제 예 (프록시 문제 해결에 대한) :

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

리눅스 버전

당신의 .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

이것은 본문을 다운로드하고 대역폭, 시간을 소비합니다. @siracusa의 답변 ( stackoverflow.com/a/38679650/6168139 )에는이 오버 헤드가 없습니다.
rushi

POST를 원할 경우 & -X POST일 경우 통과 매개 변수에 추가 하고, GET을 원할 경우 응답이 다를 수 있으므로 GET (예 : 기본값)을 사용하십시오. -프로덕션 스크립트에서 과도한 컬링을하지 않는 한 (진단 및 개발 용이 아님) 나는 약간의 대역폭에 관심이 없습니다.
Frank Nocke

서버의 파일이 '마지막 수정'을 사용하여 업데이트되는지 여부를 확인할 계획입니다. 파일 자체는 크기가 크며 일부는 GB 단위이며 일반적으로 셀룰러 인터넷에 있습니다. 따라서이 큰 대역폭은 나에게 문제가됩니다.
rushi

즉 것 해키 . siracusa의 답변 이 작업을 정확하게 수행 하므로이 작업을 수행 할 필요가 없습니다 .
rushi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.