web-dev-qa-db-ja.com

サーバーにリクエストを送信するときに、curlによって作成されたリクエストヘッダーを確認する方法を教えてください。

サーバーにリクエストを送信しているときにcurlによって作成されたリクエストヘッダーを確認したいのですが。どうすれば確認できますか?

429
leela

私は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
...
458

質問は、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
134
Tash Pemhiwa

私が自分の送信ヘッダを見ることができた唯一の方法(phpでcurl)は次のオプションを使うことでした:

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));
47
Kniganapolke

curl--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応答、正確には無関係)も得られました。


response ヘッダーだけを保存したい場合は、--dump-headerオプションを使用します。

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

利用可能なオプションについてより多くの情報が必要な場合は、curl --help | lessを使用します(これは数百行の出力を生成しますが、多くのオプションについて言及しています)。あるいは マニュアルページ を見てください - /オプションが何を意味するのかについてのより多くの説明があります。

39

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

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION libcurlを使用している場合

これは everything curlが送受信していることを示しています。

30
Daniel Stenberg

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

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

これは、 _ request _ ヘッダー、および _ response _ ヘッダーに加えて、SSL証明書や既存のTCP接続が再利用されたかどうかなどのその他の便利な情報を出力します。 -vフラグは他のフラグと組み合わせることができます。もちろん、リダイレクトやHTTP認証のプロンプトに従うことができます。

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

お役に立てれば。

27
GregT

私はこれが少し遅れていることを知っています、しかしあなたがnetcatが送ったものを正確に得るので、これをするために私が好む方法はcurlです。これは、非ASCII文字を正しく表示しない--traceまたは--trace-asciiオプションとは異なる場合があります(これらはドットとして表示されるか、デコードする必要があります)。

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

nc -l localhost 12345

これはあなたのローカルマシンのポート12345でリスニングプロセスを開きます。

2番目の端末ウィンドウで、次のようにcurlコマンドを入力します。

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

最初の端末ウィンドウには、 正確に /どのようなカールがリクエストで送信されたかが表示されます。

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

ただし、どこにもラウンドトリップが含まれていない場合や、正しく実行されるまでどこかに偽の繰り返し要求が発生しない場合は、単に要求をデバッグするのに便利なオプションです。コマンドに満足したら、それを有効なURLにリダイレクトするだけでいいのです。

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

7
Haravikk

以下のようなコマンドは3つのセクションを示します:リクエストヘッダ、レスポンスヘッダ、そしてデータ(CRLFで区切られています)。これは、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 - 標準出力と標準エラー出力を単一の標準出力にまとめる
  • sed - 以下のコマンドを使用してcurlによって生成された編集応答
  • /^* /d - '*'で始まる行を削除する(技術情報)
  • /bytes data]$/d - 'bytes data]'で終わる行を削除する(技術情報)
  • s/> // - 接頭辞 '>'を削除
  • s/< // - 接頭辞 '<'を削除
6
igorpcholkin

あるファイルのヘッダーと別のファイルの応答のペイロードをダンプします。

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
5
Barry Knapp
curl -s -v -o/dev/null -H "テストヘッダ:テスト" http://www.example.com

GETリクエストではなくHEADリクエストを送信したい場合は、-Iオプションも使用できます。

5
juancholas

これは、クッキーを含む投稿クエリを作成するための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
Tsvetan Filev

-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
2
Yekatandilburg

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

1
Visruth

wireshark または tcpdump を使用して、ネットワークトラフィックを調べることができます(httpも)。

1
Paweł Polewicz