서버로 요청을 보낼 때 curl에 의해 작성된 요청 헤더를 어떻게 볼 수 있습니까?


답변:


501

curl -v가장 쉬운 것 같아요 . 파일에 쓸 필요없이 요청 헤더 ( '>'로 시작하는 줄)를 뱉어냅니다.

$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/
* About to connect() to stackoverflow.com port 80 (#0)
*   Trying 69.59.196.211... connected
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS
> Host: stackoverflow.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...

58
curl -v -D-stackoverflow.com -o / dev / null (전체 사이트의 내용을 표시하지 않고 헤더 만 표시)
— omnomnom

20
curl -Ivs http://example.com > /dev/null: -IA에 대한 HEAD요청 -v, 보낸 헤더를 보여 -s, 숨기기 진행률 표시 줄에 > /dev/null중복을 피하기 만 -v 출력을 표시합니다.
— 여기

@PiotrekDe -D -는 깔끔하지만 -v이미 표시된 헤더를 단순히 복제했기 때문에 유용하지 않았습니다 . 자동화 된 기계 소비를 위해 접두사를 붙이지 않으면이 경우 더 좋을 수도 있지만 문제가 무엇인지 자세히 알고 싶었습니다.
— Pysis

1
"verbose"플래그의 두 가지 유용한 기능이 있습니다. 첫째, HTTPS를 통해 웹 사이트에 액세스 할 때 TLS 핸드 셰이크 프로세스를 인쇄합니다 (예 : curl -v https://www.example.com; 둘째, HTTP 프록시 등을 CONNECT통해 사이트를 방문하는 경우 요청을 인쇄합니다 . 이 답변에 이러한 두 가지 기능의 예가 언급되면 더 많은 사용자에게 도움이 될 것이라고 생각합니다. curl --proxy my-proxy:8080 http://www.example.com
— Franklin Yu

1
TL; DR : 사용하지 않음-I 현대에서는 사람들이 헤더를 보는 것에 대해 질문 할 때 아마도 API에 대해 이야기하고있을 것입니다. 그리고 " -IApache 웹 서버에서 헤더를 보는 데 사용합니다"라는 생각을 사용 HEAD한다면 아마도 사용하려고 할 때 메소드 에 대해 개발하는 데 많은 시간을 낭비하게 될 것입니다 GET. 사람들에게 사용을 말하지 마십시오 -I. 그들은 원하는 경우 HEAD, 사용 -X HEAD(TWSS)
— 브루노 Bronosky

141

이 질문은 명명 된 명령 행 명령 curl이 의미인지 아니면 전체 cURL 라이브러리인지를 지정하지 않았습니다 .

cURL 라이브러리를 사용하는 다음 PHP 코드는 첫 번째 매개 변수를 HTTP 메소드로 사용하고 (예 : "GET", "POST", "OPTIONS") 두 번째 매개 변수를 URL로 사용합니다.

<?php
$ch = curl_init();
$f = tmpfile(); # will be automatically removed after fclose()
curl_setopt_array($ch, array(
    CURLOPT_CUSTOMREQUEST  => $argv[1],
    CURLOPT_URL            => $argv[2], 
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 0,
    CURLOPT_VERBOSE        => 1,
    CURLOPT_HEADER         => 0,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT        => 30,
    CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fseek($f, 0);
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log
fclose($f);
curl_close($ch);
echo $response;

사용법 예 :

php curl-test.php OPTIONS https://google.com

결과는 다음 명령 줄과 거의 동일합니다.

curl -v -s -o - -X OPTIONS https://google.com

이 방법에 사용 된 파일에는 요청과 응답에 대한 자세한 내용과 함께 아래에 참조 된 curl_getinfo ()의 모든 항목이 포함되어 있으므로 가장 좋은 대답입니다.
— Mike_K

3
당신은 전체 전송을위한 헤더 정보 및 CURLOPT_FILE에 대한 CURLOPT_WRITEHEADER을 사용할 수 있습니다
— sturrockad

1
연결이 거부되면 지정된 파일 CURLOPT_WRITEHEADER 과 CURLOPT_FILE비어있는 파일을 명심하십시오 .
— 17 년

34
누가 사용에 대해 말한php?
— Eddie B

1
질문이 PHP와 관련이 없지만 PHP 기반 답변이 베어러 토큰을 보내는 것과 관련된 내 문제를 해결하는 올바른 방향을 제시했기 때문에 귀하의 답변을 상향 조정했습니다. 감사합니다. 나는 여기에 비슷한 문제를 가진 PHP 개발자를위한 Google 검색 에서이 질문을 표시하려는 헛된 시도에서만 내 이유를 밝혔습니다.
— Chris

49

나가는 헤더 (php로 컬)를 볼 수있는 유일한 방법은 다음 옵션을 사용하는 것입니다.

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

디버그 정보 얻기 :

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));

1
나에게 그것은 발신 헤더가 아닌 응답 헤더 인 것처럼 보였다.
— Toby

3
var_dump $data응답 본문뿐만 아니라 응답 헤더도 반환합니다. var_dump curl_getinfo($ch)는 요청 헤더를 제공합니다.
— Jrgns

2
CURLOPT_HEADER응답 헤더- CURLINFO_HEADER_OUT요청 헤더입니다. 이것은 OP가 요구하는 것입니다 :)
— Richard Parnaby-King

44

--trace-ascii에 옵션 컬은 요청 헤더뿐만 아니라, 응답 헤더 및 응답 본문을 표시합니다.

예를 들어

curl --trace-ascii curl.trace http://www.google.com/ 

curl.trace다음과 같이 시작 하는 파일 을 생성 합니다.

== Info: About to connect() to www.google.com port 80 (#0)
== Info:   Trying 209.85.229.104... == Info: connected
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0)
=> Send header, 145 bytes (0x91)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3
0050:  OpenSSL/0.9.7l zlib/1.2.3
006c: Host: www.google.com
0082: Accept: */*
008f: 

또한 기록 된 응답 (정확하지만 관련이없는 302 응답)을 받았습니다.


응답 헤더 만 저장 하려면 다음 --dump-header옵션을 사용하십시오 .

curl -D file url
curl --dump-header file url

사용 가능한 옵션에 대한 자세한 정보가 필요한 경우 사용하십시오 curl --help | less(수백 줄의 출력을 생성하지만 많은 옵션을 언급합니다). 또는 옵션의 의미에 대한 자세한 설명이 있는 매뉴얼 페이지를 찾으십시오 .


10
-D는 응답 헤더를 제공합니다 (-I와 같지만 STDIN과 동일). 질문은 요청 헤더를 요청했습니다 .
— pr1001

34

curl --trace-ascii {filename} 또는 파일 이름 대신 단일 대시를 사용하여 stdout으로 전송하십시오.

curl --trace-ascii - {URL}

libcurl을 사용하는 경우 CURLOPT_DEBUGFUNCTION

이것은 컬 이주고 받는 모든 것을 보여주고 , 추가 정보가 던져집니다.


1
이것은 매우 장황하지만 반드시 알아야 할 모든 것을 보여줍니다.
— tripleee

26

여기에서 답변을 시도했지만 가장 유용하고 쉬운 답변이 아직 답변으로 표시되지 않았지만 다음과 같습니다.

curl -v https://example.com/path

아웃이 인쇄 요청 헤더뿐만 아니라 응답의 헤더 플러스 등의 SSL 인증서와 같은 기존 TCP 연결을 재사용 여부 유용한 다른. -v플래그는 같은 HTTP 인증에 대한 후속의 리디렉션 및 프롬프트와 같은 물론 다른 플래그와 결합 될 수있다 :

curl -vL --user my_username https://example.com/path

도움이 되었기를 바랍니다.


2
그것은 최고 위치에 나열되어 있습니다
— Pmpr

19

아래와 같은 명령은 요청 헤더, 응답 헤더 및 데이터 (CRLF로 구분)의 세 섹션으로 표시됩니다. 컬에 의해 추가 된 기술 정보 및 구문 노이즈를 피합니다.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

이 명령은 다음과 같은 출력을 생성합니다.

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

기술:

  • -vs -헤더를 추가하지만 (-v) 진행률 표시 줄을 제거합니다 (-s)
  • 2>&1 -stdout과 stderr을 단일 stdout으로 결합
  • sed -아래 명령을 사용하여 curl로 생성 된 응답 편집
  • /^* /d - '*'(기술 정보)로 시작하는 줄을 제거하십시오.
  • /bytes data]$/d - 'bytes data]'(기술 정보)로 끝나는 줄 제거
  • s/> // - '>'접두사 제거
  • s/< // - '<'접두사 제거

11

나는 이것이 조금 늦었다는 것을 알고 있지만 netcat, 당신이 curl보낸 것을 정확히 얻을 때 내가 선호하는 방법은입니다 . ASCII가 아닌 문자를 올바르게 표시하지 않는 옵션 --trace또는 --trace-ascii옵션 과 다를 수 있습니다 (점으로 표시되거나 디코딩되어야 함).

첫 번째 유형에서 두 개의 터미널 창을 열어서이 작업을 매우 쉽게 수행 할 수 있습니다.

nc -l localhost 12345

로컬 컴퓨터의 포트 12345에서 청취 프로세스가 열립니다.

두 번째 터미널 창에서 curl 명령을 입력하십시오.

curl --form 'foo=bar' localhost:12345

첫 번째 터미널 창 에서 요청에서 어떤 컬이 전송 되었는지 정확하게 볼 수 있습니다.

물론 nc입력하지 않는 한 응답으로 아무것도 보내지 않으므로 curl 명령 (control-c)을 중단하고 각 테스트에 대해 프로세스를 반복해야합니다.

그러나이 방법은 요청을 디버깅하기위한 유용한 옵션입니다. 어디에서나 왕복 여행을하지 않거나 원하는 위치에 올 때까지 가짜 반복 요청을 생성하지 않기 때문입니다. 명령에 만족하면 명령을 유효한 URL로 리디렉션하면됩니다.

cURL 라이브러리에 대해서도 동일한 작업을 수행 할 수 있으며, nc만족할 때까지 로컬 리스너 를 가리 키도록 요청을 편집하기 만하면 됩니다.


6

하나의 파일에 헤더를 덤프하고 다른 파일에 응답의 페이로드를 덤프하십시오.

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt

5
curl -s -v -o / dev / null -H "Testheader : 테스트"http://www.example.com

-IGET 요청이 아닌 HEAD 요청을 보내려는 경우 옵션 을 사용할 수도 있습니다 .


3

다음은 쿠키가 포함 된 게시물 쿼리를 작성하는 PHP의 http 클라이언트입니다.

function http_login_client($url, $params = "", $cookies_send = "" ){

    // Vars
    $cookies = array();
    $headers = getallheaders();

    // Perform a http post request to $ur1 using $params
    $ch = curl_init($url);
    $options = array(   CURLOPT_POST => 1,
                        CURLINFO_HEADER_OUT => true,
                        CURLOPT_POSTFIELDS => $params,
                        CURLOPT_RETURNTRANSFER => 1,
                        CURLOPT_HEADER => 1,
                        CURLOPT_COOKIE => $cookies_send,
                        CURLOPT_USERAGENT => $headers['User-Agent']
                    );

    curl_setopt_array($ch, $options);

    $response = curl_exec($ch);

/// 디버그 정보 echo $ response; var_dump (curl_getinfo ($ ch)); ///

    // Parse response and read cookies
    preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches);

    // Build an array with cookies
    foreach( $matches[1] as $index => $cookie )
        $cookies[$cookie] = $matches[2][$index];

    return $cookies;
} // end http_login_client

3

당신은 그것을 사용하여 그것을 볼 수 있습니다 -iv

$> curl  -ivH "apikey:ad9ff3d36888957" --form  "file=@/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image

1

wireshark 또는 tcpdump 를 사용 하여 모든 네트워크 트래픽을 확인할 수 있습니다 (http).


11
페이로드가 HTTPS를 통한 경우 프록시 또는 애플리케이션 계층 모니터 없이는 사용할 수 없습니다.
— p00ya

1

https://http-tools.appspot.com/reflect-http-request/some-unique-id에 샘플 요청을 작성 하고 해당 파인더 URL https로 요청에 포함 된 내용 (요청 헤더, 요청 본문, 요청 매개 변수)을 확인 하십시오 https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . 대신 문자열을 사용할 수 있습니다 . 자세한 내용은 https://http-tools.appspot.com 을 some-unique-id확인 하십시오.


1
감사합니다. 질문에 정확하게 대답하지는 않지만 이것이 바로 내가 필요한 것입니다. 장치 A는 요청을하고 장치 B는 요청이 이루어 졌는지 확인합니다.
— domen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.