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

485

Saya ingin melihat header permintaan yang dibuat curlketika saya mengirim permintaan ke server. Bagaimana saya bisa memeriksanya?

Jonathan Leffler
sumber
url ini mungkin membantu. helloacm.com/curl
doctorlai
1
Anda dapat menggunakan ini untuk menguji run-node.com/now-use-curl-with-http-echo-com
John Williams

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
...
Steven Kryskalla
sumber
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
Tash Pemhiwa
sumber
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));
Kniganapolke
sumber
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.

Jonathan Leffler
sumber
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.

Daniel Stenberg
sumber
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.

GregT
sumber
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 '<'
igorpcholkin
sumber
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.

Haravikk
sumber
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
Barry Knapp
sumber
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.

juancholas
sumber
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
Tsvetan Filev
sumber
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
Yekatandilburg
sumber
1

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

Paweł Polewicz
sumber
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.

Visruth
sumber
1
Terima kasih, walaupun tidak menjawab pertanyaan dengan tepat, inilah yang saya butuhkan. Perangkat A membuat permintaan, Perangkat B memeriksa permintaan telah dibuat.
domen