curl
Sunucuya istek gönderirken yapılan istek başlıklarını görmek istiyorum . Bunu nasıl kontrol edebilirim?
curl
Sunucuya istek gönderirken yapılan istek başlıklarını görmek istiyorum . Bunu nasıl kontrol edebilirim?
Yanıtlar:
Bence curl -v
en kolayı bu. Bir dosyaya yazmak zorunda kalmadan istek başlıklarını ('>' ile başlayan satırlar) tükürecektir:
$ 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
bir HEAD
istek için, -v
gönderilen üstbilgileri göstermek, -s
ilerleme çubuğunu gizlemek, > /dev/null
yalnızca -v çıktısını göstermek, çoğaltmayı önlemek.
-D -
düzgün, ama -v
zaten görüntülenen başlıkları çoğaltmak için benim için yararlı değildi . Otomatik makine tüketimi için ön düzeltilmelerini istemiyorsanız, belki de bu durumda daha iyi olurdu, ancak sadece bir sorunun daha ayrıntılı olarak ne olduğunu görmek istedim.
curl -v https://www.example.com
; İkinci, aynı zamanda yazdırır CONNECT
Eğer aracılığıyla siteyi ziyaret edip istek vekil HTTP gibi curl --proxy my-proxy:8080 http://www.example.com
. Bu cevapta bu iki özelliğin bazı örneklerinden bahsedilirse daha fazla kullanıcıya yardımcı olacağına inanıyorum.
-I
Modern dünyada insanlar üstbilgileri görmek istediğinde muhtemelen API'lerden bahsediyorlar. Ve " -I
Apache web sunucumla başlıkları görmek için kullanıyorum " anlayışını kullanırsanız, HEAD
muhtemelen kullanmak istediğinizde bir yönteme karşı çok fazla zaman harcayacaksınız GET
. İnsanlara kullanmasını söylemeyin -I
. Eğer isterse (TWSS) HEAD
kullanın-X HEAD
Soru, adlı komut satırı komutunun curl
veya tüm cURL kitaplığının kastedildiğini belirtmedi .
CURL kütüphanesini kullanan aşağıdaki PHP kodu, HTTP parametresi olarak ilk parametreyi (örn. "GET", "POST", "OPTIONS") ve URL olarak ikinci parametreyi kullanır.
<?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;
Örnek kullanım:
php curl-test.php OPTIONS https://google.com
Sonuçların aşağıdaki komut satırıyla neredeyse aynı olduğunu unutmayın
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
ve CURLOPT_FILE
boş olan dosyalar reddedilir .
php?
Giden başlıklarımı (php ile kıvır) görmeyi başarabilmemin tek yolu aşağıdaki seçenekleri kullanmaktı:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
Hata ayıklama bilgilerinizi alma:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
hem yanıt başlıklarını hem de yanıt gövdesini döndürür. Var_dump curl_getinfo($ch)
size istek başlıklarını verecektir.
CURLOPT_HEADER
yanıt başlığıdır - CURLINFO_HEADER_OUT
istek başlığıdır. OP'nin istediği bu :)
--trace-ascii
Seçeneği kıvrılma istek başlıklarını yanı sıra yanıt başlıklarını ve tepki gövdesini gösterecektir.
Örneğin, komut
curl --trace-ascii curl.trace http://www.google.com/
curl.trace
aşağıdaki gibi başlayan bir dosya üretir :
== 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:
Ayrıca, kaydedilen bir yanıt (302 yanıt, kesin ancak alakasız) aldı.
Yalnızca yanıt başlıklarını kaydetmek istiyorsanız , şu --dump-header
seçeneği kullanın:
curl -D file url
curl --dump-header file url
Kullanılabilir seçenekler hakkında daha fazla bilgiye ihtiyacınız varsa, kullanın curl --help | less
(birkaç yüz satır çıktı üretir, ancak birçok seçenekten bahseder). Veya seçeneklerin ne anlama geldiğiyle ilgili daha fazla açıklamanın bulunduğu manuel sayfayı bulun .
curl --trace-ascii {dosyaadı} veya stdout'a gönderilmesini sağlamak için dosya adı yerine tek bir tire kullanın:
curl --trace-ascii - {URL}
Libcurl kullanıyorsanız CURLOPT_DEBUGFUNCTION
Bu, curl'un gönderdiği ve aldığı her şeyi gösterir , bazı ekstra bilgiler atılır.
Cevapları burada denedim ve en kullanışlı ve en kolay olanın henüz bir cevap olarak listelenmediğini buldum, ancak:
curl -v https://example.com/path
Bu, REQUEST başlıklarının yanı sıra RESPONSE başlıklarının yanı sıra SSL sertifikası ve var olan bir TCP bağlantısının yeniden kullanılıp kullanılmadığı gibi diğer yararlıları da yazdırır . -v
bayrak böyle HTTP kimlik almak için sonradan yönlendirmelere ve hızlı olarak elbette diğer bayrakların, ile kombine edilebilir:
curl -vL --user my_username https://example.com/path
Bu yardımcı olur umarım.
Aşağıdaki gibi bir komut üç bölüm gösterir: istek başlıkları, yanıt başlıkları ve veriler (CRLF ile ayrılmış). Kıvrılma ile eklenen teknik bilgileri ve sözdizimsel gürültüyü önler.
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
Komut aşağıdaki çıktıyı üretir:
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>
Açıklama:
-vs
- üstbilgi ekle (-v) ancak ilerleme çubuğunu kaldır (-s)2>&1
- stdout ve stderr'i tek bir stdout'ta birleştirinsed
- curl tarafından üretilen yanıtı aşağıdaki komutları kullanarak düzenleyin/^* /d
- '*' ile başlayan satırları kaldır (teknik bilgi)/bytes data]$/d
- 'bayt verileri]' ile biten satırları kaldır (teknik bilgi)s/> //
- '>' önekini kaldırs/< //
- '<' önekini kaldırBunun biraz geç olduğunu biliyorum, ama bunu yapmak için tercih ettiğim yöntem netcat
, tam olarak ne curl
gönderdiğini aldığınız gibi ; bu, ASCII olmayan karakterleri düzgün göstermeyecek --trace
veya --trace-ascii
seçeneklerden farklı olabilir (yalnızca nokta olarak gösterilir veya kodlarının çözülmesi gerekir).
İlk tipte iki terminal penceresi açarak bunu çok kolay bir şekilde yapabilirsiniz:
nc -l localhost 12345
Bu, yerel makinenizin 12345 numaralı bağlantı noktasında bir dinleme işlemi açar.
İkinci terminal penceresinde curl komutunuzu girin, örneğin:
curl --form 'foo=bar' localhost:12345
İlk terminal penceresinde , istekte tam olarak hangi kıvrımın gönderildiğini göreceksiniz .
Şimdi elbette nc
yanıt olarak hiçbir şey göndermeyeceksiniz (kendinize yazmazsanız), bu nedenle curl komutunu (control-c) kesmeniz ve işlemi her test için tekrarlamanız gerekir.
Ancak, bu, herhangi bir yere gidiş-dönüş yolculuğu yapmadığınız veya doğru olana kadar bir yerde sahte, yinelemeli istekler üretmediğiniz için, isteğinizde hata ayıklamak için kullanışlı bir seçenektir; komuttan memnun olduğunuzda, geçerli bir URL'ye yönlendirmeniz yeterlidir.
Aynı şeyi herhangi bir cURL kütüphanesi için de yapabilirsiniz, nc
bundan memnun olana kadar yerel dinleyiciyi işaret etme isteğinizi düzenleyin .
başlıkları bir dosyaya ve yanıtın yükünü farklı bir dosyaya dök
curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt
curl -s -v -o / dev / null -H "Test başlığı: test" http://www.example.com
-I
GET isteği değil bir HEAD isteği göndermek istiyorsanız seçeneği de kullanabilirsiniz .
İşte çerezler dahil sonrası sorguları yapmak için php benim http istemci:
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 bilgisi echo $ yanıt; 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
Kullanarak görebilirsiniz -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
Https://http-tools.appspot.com/reflect-http-request/some-unique-id için örnek bir istekte bulunun ve ilgili isteğin URL'si https ile bu isteğin ne içerdiğini (istek üstbilgisi, istek gövdesi, istek parametreleri) kontrol edin : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Bunun yerine herhangi bir dize kullanabilirsiniz some-unique-id
, daha fazla ayrıntı için https://http-tools.appspot.com adresine bakın.