서버로 요청을 보낼 때 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.comsome-unique-id확인 하십시오.


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