Saya ingin melihat header permintaan yang dibuat curl
ketika saya mengirim permintaan ke server. Bagaimana saya bisa memeriksanya?
Saya ingin melihat header permintaan yang dibuat curl
ketika saya mengirim permintaan ke server. Bagaimana saya bisa memeriksanya?
Jawaban:
Saya pikir curl -v
paling 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
...
curl -Ivs http://example.com > /dev/null
: -I
untuk HEAD
permintaan, -v
menampilkan tajuk yang dikirim, -s
menyembunyikan bilah progres, > /dev/null
hanya menampilkan keluaran -v, menghindari duplikasi.
-D -
rapi, tetapi tidak berguna bagi saya karena hanya menduplikasi header yang -v
sudah 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.
curl -v https://www.example.com
; kedua, itu juga mencetak CONNECT
permintaan 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.
-I
Di dunia modern, ketika orang bertanya tentang melihat header, mereka mungkin berbicara tentang API. Dan jika Anda menggunakan -I
mentalitas "Saya gunakan untuk melihat header dengan server web Apache saya", Anda akan membuang banyak waktu untuk mengembangkan suatu HEAD
metode ketika Anda mungkin bermaksud menggunakannya GET
. Berhentilah memberi tahu orang untuk menggunakan -I
. Jika mereka mau HEAD
, gunakan -X HEAD
(TWSS)
Pertanyaannya tidak menentukan apakah perintah baris perintah bernama curl
dimaksudkan 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
CURLOPT_WRITEHEADER
dan CURLOPT_FILE
kosong.
php?
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));
var_dump $data
akan mengembalikan header respons dan juga badan respons. Var_dump curl_getinfo($ch)
akan memberi Anda header permintaan.
CURLOPT_HEADER
adalah header respons - CURLINFO_HEADER_OUT
adalah header permintaan. Inilah yang diminta OP :)
The --trace-ascii
pilihan 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.trace
yang 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-header
opsi:
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.
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.
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 -v
flag 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.
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 tunggalsed
- 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 '<'Saya tahu ini sedikit terlambat, tetapi metode favorit saya untuk melakukan ini adalah netcat
, karena Anda mendapatkan persis apa yang curl
dikirim; ini dapat berbeda dari opsi --trace
atau --trace-ascii
yang 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 nc
tidak 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 nc
pendengar lokal sampai Anda puas.
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
curl -s -v -o / dev / null -H "Testheader: test" http://www.example.com
Anda juga dapat menggunakan -I
opsi jika Anda ingin mengirim permintaan HEAD dan bukan permintaan GET.
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
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
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.