Sunucuya istek gönderirken curl tarafından yapılan istek başlıklarını nasıl görebilirim?


Yanıtlar:


501

Bence curl -ven 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
...

58
curl -v -D - stackoverflow.com -o / dev / null (tüm sitenin içeriğini görüntülemek için değil, sadece başlıklar)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Ibir HEADistek için, -vgönderilen üstbilgileri göstermek, -silerleme çubuğunu gizlemek, > /dev/nullyalnızca -v çıktısını göstermek, çoğaltmayı önlemek.
burada

@PiotrekDe -D -düzgün, ama -vzaten 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.
Pysis

1
"Ayrıntılı" bayrağının çok yararlı iki özelliği vardır: birincisi, HTTPS aracılığıyla web sitesine erişirken TLS el sıkışma işlemini de yazdırır curl -v https://www.example.com; İkinci, aynı zamanda yazdırır CONNECTEğ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.
Franklin Yu

1
TL; DR: Kullanma-I Modern dünyada insanlar üstbilgileri görmek istediğinde muhtemelen API'lerden bahsediyorlar. Ve " -IApache web sunucumla başlıkları görmek için kullanıyorum " anlayışını kullanırsanız, HEADmuhtemelen kullanmak istediğinizde bir yönteme karşı çok fazla zaman harcayacaksınız GET. İnsanlara kullanmasını söylemeyin -I. Eğer isterse (TWSS) HEADkullanın-X HEAD
Bruno Bronosky

141

Soru, adlı komut satırı komutunun curlveya 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

Bu en iyi yanıttır, çünkü bu yöntemde kullanılan dosya, aşağıda başvurulan curl_getinfo () öğesinde, istek ve yanıt hakkında daha fazla ayrıntıyla birlikte her şeyi içerir.
Mike_K

3
Başlık bilgisi için CURLOPT_WRITEHEADER ve tüm aktarım için CURLOPT_FILE kullanabilirsiniz
sturrockad

1
Bağlantı reddedilirse, belirtilen CURLOPT_WRITEHEADER ve CURLOPT_FILEboş olan dosyalar reddedilir .
16'da

34
Kim kullanma hakkında bir şey söylediphp?
Eddie B

1
Soru php ile ilgili olmasa da, php tabanlı cevabınız bana bir taşıyıcı belirteci gönderme ile kendi sorunumu çözmek için doğru yöne işaret ettiğinden cevabınızı destekledim. Teşekkür ederim. Nedeni burada sadece bu sorunun gelecekte benzer bir sorun ile php devs için google aramalarında görünmesini boşuna girişiminde belirtti.
Chris

49

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

1
Benim için giden başlık değil yanıt başlığı gibi görünüyordu.
Toby

3
var_dump $datahem 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.
Haziran'da Jrgns

2
CURLOPT_HEADERyanıt başlığıdır - CURLINFO_HEADER_OUTistek başlığıdır. OP'nin istediği bu :)
Richard Parnaby-King

44

--trace-asciiSeç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.traceaş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-headerseç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 .


10
-D size yanıt başlıklarını verir (-I gibi ama STDIN'e). Soru istek başlıklarını istedi .
pr1001

34

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.


1
Bu çok ayrıntılı, ama kesinlikle bilmeniz gereken her şeyi size gösteriyor.
Üçlü

27

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 . -vbayrak 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.


2
En üst sırada yer almaktadır
Pmpr

19

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ştirin
  • sed - 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ır
  • s/< // - '<' önekini kaldır

11

Bunun biraz geç olduğunu biliyorum, ama bunu yapmak için tercih ettiğim yöntem netcat, tam olarak ne curlgönderdiğini aldığınız gibi ; bu, ASCII olmayan karakterleri düzgün göstermeyecek --traceveya --trace-asciiseç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 ncyanı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, ncbundan memnun olana kadar yerel dinleyiciyi işaret etme isteğinizi düzenleyin .


6

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

5
curl -s -v -o / dev / null -H "Test başlığı: test" http://www.example.com

-IGET isteği değil bir HEAD isteği göndermek istiyorsanız seçeneği de kullanabilirsiniz .


3

İş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

3

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

1

Herhangi bir ağ trafiğine bakmak için wireshark veya tcpdump kullanabilirsiniz (http).


11
eğer yük HTTPS üzerindeyse, bunlar proxy veya uygulama katmanı monitörü olmadan işe yaramaz.
p00ya

1

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.


1
Teşekkürler, soruyu tam olarak cevaplamasa da, tam da ihtiyacım olan şey bu. Cihaz A bir istekte bulunur, Cihaz B bir talebin yapıldığını kontrol eder.
domen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.