サーバーにリクエストを送信するときに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(サイト全体のコンテンツを表示せず、ヘッダーのみを表示するため)
omn​​omnom '26

20
curl -Ivs http://example.com > /dev/null-IのためにHEAD要求、-v、送られたヘッダを表示するには-s、非表示プログレスバーに> /dev/null重複を避け、唯一-vの出力を表示します。
ここでは

@PiotrekDe -D -はすっきりしていましたが、-vすでに表示されているヘッダーを単に複製しただけなので、私には役に立ちませんでした。マシンの自動消費のためにプレフィックスを付けないようにしたい場合は、その場合は多分それがより良いでしょうが、問題の詳細を垣間見たかっただけです。
Pysis

1
「verbose」フラグには2つの非常に役立つ機能があります。1つ目は、HTTPS経由でWebサイトにアクセスするときに、TLSハンドシェイクプロセスも出力しますcurl -v https://www.example.comCONNECT次に、などのHTTPプロキシを介してサイトにアクセスしている場合もリクエストを出力しますcurl --proxy my-proxy:8080 http://www.example.com。この2つの機能のいくつかの例がこの回答で言及されていれば、より多くのユーザーに役立つと思います。
フランクリンYu

1
TL; DR:使用しない-I現代では、ヘッダーの表示について人々が尋ねるとき、おそらくAPIについて話しています。「-IApache Webサーバーでヘッダーを表示するために使用する」という考え方HEADを使用してGETいる場合、おそらく使用するつもりのメソッドに対して、開発に多くの時間を費やすことになります。使用するように言うのをやめる-I。必要に応じてHEAD-X HEAD(TWSS)を使用してください
Bruno Bronosky

141

質問では、指名curlされたコマンドラインコマンドが意図されたものなのか、cURLライブラリ全体なのかは明記されていません。

cURLライブラリを使用する次のPHPコードは、最初のパラメーターをHTTPメソッドとして使用し(例:「GET」、「POST」、「OPTIONS」)、2番目のパラメーターを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_WRITEHEADERを使用し、転送全体にはCURLOPT_FILEを使用できます
sturrockad

1
接続が拒否された場合、で指定されCURLOPT_WRITEHEADER CURLOPT_FILE空のファイルであることを覚えておいてください。
16年

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 2009

34

curl --trace-ascii {filename}またはファイル名の代わりに単一のダッシュを使用してstdoutに送信します。

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTIONlibcurlをいる場合は

これにより、curlが送受信するすべての情報と、いくつかの追加情報が表示されます。


1
これは非常に冗長ですが、知っておくべきすべてのことを確実に示しています。
tripleee

27

私はここで答えを試しましたが、最も有用で最も簡単なものはまだ答えとしてリストされていませんが、それは次のとおりです:

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

これにより、REQUESTヘッダーとRESPONSEヘッダーに加え、SSL証明書などのその他の有用な情報と、既存のTCP接続が再利用されたかどうかが出力されます。-vフラグは、そのようなHTTP認証のためにリダイレクトし、迅速に追従するようコースの他のフラグ、と組み合わせることができます。

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

お役に立てれば。


2
最上位にリストされています
Pmpr

19

以下のようなコマンドは、リクエストヘッダー、レスポンスヘッダー、データ(CRLFで区切られた)の3つのセクションを表示します。curlによって追加される技術情報や構文ノイズを回避します。

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を1つのstdoutに結合
  • sed -以下のコマンドを使用して、curlによって生成された応答を編集します
  • /^* /d -'*'で始まる行を削除(技術情報)
  • /bytes data]$/d -「バイトデータ]」で終わる行を削除します(技術情報)
  • s/> // -'>'プレフィックスを削除
  • s/< // -'<'プレフィックスを削除

11

私はこれが少し遅れていることを知っていますがnetcat、これを行うための私の好ましい方法は、curl送信されたものを正確に取得するためです。これは異なる可能--trace--trace-ascii(彼らはドットまたはデコードする必要があるとして表示)適切に非ASCII文字が表示されませんどのオプション。

最初のタイプでは、2つのターミナルウィンドウを開くことで、これを非常に簡単に行うことができます。

nc -l localhost 12345

これにより、ローカルマシンのポート12345でリスニングプロセスが開きます。

2番目のターミナルウィンドウで、curlコマンドを入力します。次に例を示します。

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

最初のターミナルウィンドウには、リクエストで送信されたcurlが正確に表示されます。

もちろんnc、応答は何も送信されません(自分で入力しない限り)。そのため、curlコマンド(control-c)を中断して、テストごとにプロセスを繰り返す必要があります。

ただし、これはリクエストを簡単にデバッグするための便利なオプションです。ラウンドトリップがどこにも含まれていないか、正しくなるまでどこかに偽の反復リクエストが生成されないためです。コマンドに満足したら、有効なURLにリダイレクトするだけでよいのです。

どのcURLライブラリでも同じことができncます。満足するまで、ローカルリスナーを指すようにリクエストを編集してください。


6

ヘッダーを1つのファイルにダンプし、応答のペイロードを別のファイルにダンプする

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

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

-IGETリクエストではなくHEADリクエストを送信する場合は、optionを使用することもできます。


3

ここに含まれているcookieを使用して投稿クエリを作成する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);

/// DEBUG info 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

https://http-tools.appspot.com/reflect-http-request/some-unique-idへのサンプルリクエストを作成し、対応するファインダーURL httpsによってこのリクエストに含まれるもの(リクエストヘッダー、リクエストボディ、リクエストパラメーター)を確認します://http-tools.appspot.com/reflect-http-request-finder/some-unique-id。の代わりに任意の文字列を使用できます。詳細については、https://http-tools.appspot.comsome-unique-id確認してください


1
おかげで、質問に正確に答えることはできませんが、これがまさに私が必要としたものです。デバイスAはリクエストを行い、デバイスBはリクエストが行われたことを確認します。
ドメン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.