Bagaimana saya bisa melihat header permintaan yang dibuat oleh curl saat mengirim permintaan ke server?


Jawaban:


501

Saya pikir curl -vpaling mudah. Ini akan memuntahkan header permintaan (baris yang diawali dengan '>') tanpa harus menulis ke file:

$ 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 (agar tidak menampilkan konten seluruh situs, hanya tajuk)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Iuntuk HEADpermintaan, -vmenampilkan tajuk yang dikirim, -smenyembunyikan bilah progres, > /dev/nullhanya menampilkan keluaran -v, menghindari duplikasi.
sini

@PiotrekDe -D -rapi, tetapi tidak berguna bagi saya karena hanya menduplikasi header yang -vsudah ditampilkan. Jika Anda ingin mereka tidak diperbaiki untuk konsumsi mesin otomatis, maka mungkin akan lebih baik dalam hal itu, tapi saya hanya ingin melihat apa masalah yang lebih detail.
Pysis

1
Ada dua fitur yang sangat membantu dari flag "verbose": pertama, flag ini juga mencetak proses jabat tangan TLS ketika mengakses situs web melalui HTTPS, seperti curl -v https://www.example.com; kedua, itu juga mencetak CONNECTpermintaan jika Anda mengunjungi situs melalui proxy HTTP , seperti curl --proxy my-proxy:8080 http://www.example.com. Saya percaya ini akan membantu lebih banyak pengguna jika beberapa contoh dari dua fitur ini disebutkan dalam jawaban ini.
Franklin Yu

1
TL; DR: Jangan gunakan-I Di dunia modern, ketika orang bertanya tentang melihat header, mereka mungkin berbicara tentang API. Dan jika Anda menggunakan -Imentalitas "Saya gunakan untuk melihat header dengan server web Apache saya", Anda akan membuang banyak waktu untuk mengembangkan suatu HEADmetode ketika Anda mungkin bermaksud menggunakannya GET. Berhentilah memberi tahu orang untuk menggunakan -I. Jika mereka mau HEAD, gunakan -X HEAD(TWSS)
Bruno Bronosky

141

Pertanyaannya tidak menentukan apakah perintah baris perintah bernama curldimaksudkan atau seluruh pustaka cURL.

Kode PHP berikut ini menggunakan pustaka cURL menggunakan parameter pertama sebagai metode HTTP (mis. "GET", "POST", "OPTIONS") dan parameter kedua sebagai 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;

Contoh penggunaan:

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

Perhatikan bahwa hasilnya hampir identik dengan baris perintah berikut

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

Ini adalah jawaban terbaik, karena file yang digunakan dalam metode ini berisi semua yang ada di curl_getinfo () yang dirujuk di bawah ini, bersama dengan perincian lebih lanjut tentang permintaan dan responsnya.
Mike_K

3
Anda dapat menggunakan CURLOPT_WRITEHEADER untuk informasi tajuk dan CURLOPT_FILE untuk seluruh transfer
sturrockad

1
Ingatlah bahwa jika koneksi ditolak file yang ditentukan dengan CURLOPT_WRITEHEADER dan CURLOPT_FILEkosong.
eithed

34
Siapa yang mengatakan apa-apa tentang menggunakanphp?
Eddie B

1
Saya telah memutakhirkan jawaban Anda karena sementara pertanyaannya tidak terkait dengan php, jawaban berbasis php Anda mengarahkan saya ke arah yang benar untuk menyelesaikan masalah saya sendiri dengan mengirimkan token pembawa. Terima kasih. Saya menyatakan alasan saya di sini hanya dalam upaya sia-sia untuk memiliki pertanyaan ini muncul di pencarian google masa depan untuk php devs dengan masalah yang sama.
Chris

49

Satu-satunya cara saya berhasil melihat tajuk keluar (curl with php) menggunakan opsi berikut:

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

Mendapatkan info debug Anda:

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

1
Bagi saya yang tampaknya menjadi header respons bukan header keluar.
Toby

3
var_dump $dataakan mengembalikan header respons dan juga badan respons. Var_dump curl_getinfo($ch)akan memberi Anda header permintaan.
Jrgns

2
CURLOPT_HEADERadalah header respons - CURLINFO_HEADER_OUTadalah header permintaan. Inilah yang diminta OP :)
Richard Parnaby-King

44

The --trace-asciipilihan untuk keriting akan menampilkan header permintaan, serta header respon dan respon tubuh.

Misalnya, perintahnya

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

menghasilkan file curl.traceyang dimulai sebagai berikut:

== 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: 

Itu juga mendapat respons (respons 302, tepatnya tetapi tidak relevan) yang dicatat.


Jika Anda hanya ingin menyimpan header respons , gunakan --dump-headeropsi:

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

Jika Anda memerlukan informasi lebih lanjut tentang opsi yang tersedia, gunakan curl --help | less(ini menghasilkan beberapa ratus garis output tetapi menyebutkan banyak opsi). Atau temukan halaman manual di mana ada lebih banyak penjelasan tentang apa arti opsi tersebut.


10
-D memberi Anda header respons (seperti halnya -I, tetapi untuk STDIN). Pertanyaannya menanyakan header permintaan .
pr1001

34

curl --trace-ascii {filename} atau gunakan tanda hubung tunggal alih-alih nama file untuk mengirimnya ke stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION jika Anda menggunakan libcurl

Ini menunjukkan kepada Anda segala sesuatu yang dikirim dan diterima, dengan beberapa info tambahan dimasukkan.


1
Ini sangat bertele-tele, tetapi tentu saja menunjukkan segala yang harus Anda ketahui.
tripleee

27

Saya mencoba jawabannya di sini dan menemukan bahwa yang paling berguna dan termudah belum terdaftar sebagai jawaban, tetapi itu adalah:

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

Ini mencetak header PERMINTAAN serta header RESPONS plus berguna lainnya seperti sertifikat SSL dan apakah koneksi TCP yang ada digunakan kembali. yang -vflag dapat dikombinasikan dengan bendera lainnya, tentu saja, seperti untuk tindak pengalihan dan cepat untuk HTTP otentikasi:

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

Semoga ini membantu.


2
Tercantum di tempat paling atas
Pmpr

19

Perintah seperti di bawah ini akan menampilkan tiga bagian: header permintaan, header respons, dan data (dipisahkan oleh CRLF). Ini menghindari informasi teknis dan kebisingan sintaksis yang ditambahkan oleh curl.

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

Perintah akan menghasilkan output berikut:

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>

Deskripsi:

  • -vs - tambahkan header (-v) tetapi hapus progress bar (-s)
  • 2>&1 - gabungkan stdout dan stderr menjadi stdout tunggal
  • sed - edit respons yang dihasilkan oleh curl menggunakan perintah di bawah ini
  • /^* /d - hapus baris yang dimulai dengan '*' (info teknis)
  • /bytes data]$/d - hapus baris yang diakhiri dengan 'data byte]' (info teknis)
  • s/> // - hapus awalan '>'
  • s/< // - hapus awalan '<'

11

Saya tahu ini sedikit terlambat, tetapi metode favorit saya untuk melakukan ini adalah netcat, karena Anda mendapatkan persis apa yang curldikirim; ini dapat berbeda dari opsi --traceatau --trace-asciiyang tidak akan menampilkan karakter non-ASCII dengan benar (mereka hanya ditampilkan sebagai titik atau perlu diterjemahkan).

Anda dapat melakukan ini dengan sangat mudah dengan membuka dua terminal windows, pada tipe pertama:

nc -l localhost 12345

Ini membuka proses mendengarkan pada port 12345 dari mesin lokal Anda.

Di jendela terminal kedua masukkan perintah curl Anda, misalnya:

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

Di jendela terminal pertama Anda akan melihat secara tepat ikal apa yang dikirim dalam permintaan.

Sekarang tentu saja nctidak akan mengirim apa pun sebagai respons (kecuali Anda mengetiknya sendiri), jadi Anda perlu menghentikan perintah curl (control-c) dan ulangi proses untuk setiap tes.

Namun, ini adalah opsi yang berguna untuk hanya men-debug permintaan Anda, karena Anda tidak melibatkan pulang-pergi di mana pun, atau menghasilkan permintaan berulang yang palsu di suatu tempat sampai Anda melakukannya dengan benar; setelah Anda puas dengan perintahnya, cukup arahkan kembali ke URL yang valid dan Anda siap melakukannya.

Anda juga dapat melakukan hal yang sama untuk perpustakaan CURL, cukup edit permintaan Anda untuk menunjuk ke ncpendengar lokal sampai Anda puas.


6

buang header dalam satu file dan payload dari respons dalam file yang berbeda

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

Anda juga dapat menggunakan -Iopsi jika Anda ingin mengirim permintaan HEAD dan bukan permintaan GET.


3

Berikut ini adalah klien http saya di php untuk memasukkan kueri posting dengan cookie:

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

Anda bisa melihatnya dengan menggunakan -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

Anda dapat menggunakan wireshark atau tcpdump untuk melihat lalu lintas jaringan apa pun (http juga).


11
jika payload melebihi HTTPS, itu tidak berguna tanpa proxy atau monitor layer aplikasi.
p00ya

1

Buat contoh permintaan ke https://http-tools.appspot.com/reflect-http-request/some-unique-id dan periksa isi permintaan ini (tajuk permintaan, badan permintaan, parameter permintaan) dengan url pencari yang sesuai https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Anda dapat menggunakan string apa pun alih-alih some-unique-id, periksa https://http-tools.appspot.com untuk detail selengkapnya.


1
Terima kasih, walaupun tidak menjawab pertanyaan dengan tepat, inilah yang saya butuhkan. Perangkat A membuat permintaan, Perangkat B memeriksa permintaan telah dibuat.
domen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.