Come posso vedere le intestazioni delle richieste fatte da curl quando invio una richiesta al server?


Risposte:


501

Penso che curl -vsia il più semplice. Sputerà le intestazioni della richiesta (righe precedute da '>') senza dover scrivere in un 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 (per non visualizzare l'intero contenuto del sito, solo le intestazioni)
omnomnom,

20
curl -Ivs http://example.com > /dev/null: -Iper una HEADrichiesta, -vper mostrare le intestazioni inviate, -sper nascondere la barra di avanzamento, > /dev/nullper mostrare solo l'output -v, evitando la duplicazione.
qui,

@PiotrekDe -D -era pulito, ma non mi è stato utile in quanto ha semplicemente duplicato le intestazioni che erano -vgià visualizzate. Se li desideri non prefissati per il consumo automatico delle macchine, allora forse sarebbe meglio in quel caso, ma volevo solo intravedere quale problema era in modo più dettagliato.
Pysis,

1
Ci sono due funzioni molto utili del flag "verbose": in primo luogo, stampa anche il processo di handshake TLS quando si accede al sito Web tramite HTTPS, come ad esempio curl -v https://www.example.com; in secondo luogo, stampa anche la CONNECTrichiesta se si sta visitando il sito tramite proxy HTTP , ad esempio curl --proxy my-proxy:8080 http://www.example.com. Credo che aiuterebbe più utenti se alcuni esempi di queste due funzionalità sono menzionati in questa risposta.
Franklin Yu,

1
TL; DR: Non usare-I nel mondo moderno, quando le persone chiedono di vedere le intestazioni, probabilmente stanno parlando di API. E se usi quella -Imentalità "Uso per vedere le intestazioni con il mio server web Apache", perderai molto tempo a sviluppare un HEADmetodo che probabilmente intendi usare GET. Smetti di dire alle persone di usare -I. Se lo desiderano HEAD, usa -X HEAD(TWSS)
Bruno Bronosky l'

141

La domanda non specificava se curlsi intendesse il comando da riga di comando denominato o l'intera libreria cURL.

Il seguente codice PHP che utilizza la libreria cURL utilizza il primo parametro come metodo HTTP (ad es. "GET", "POST", "OPTIONS") e il secondo parametro come 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;

Esempio di utilizzo:

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

Si noti che i risultati sono quasi identici alla seguente riga di comando

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

Questa è la risposta migliore, poiché il file utilizzato in questo metodo contiene tutto in curl_getinfo () indicato di seguito, insieme a maggiori dettagli sia sulla richiesta che sulla risposta.
Mike_K,

3
Puoi utilizzare CURLOPT_WRITEHEADER per le informazioni di intestazione e CURLOPT_FILE per l'intero trasferimento
sturrockad,

1
Tieni a mente che se la connessione viene rifiutata file che sono stati specificati con CURLOPT_WRITEHEADER e CURLOPT_FILEsono vuoti.
Eithed

34
Chi ha detto qualcosa sull'usophp?
Eddie B,

1
Ho votato a fondo la tua risposta perché mentre la domanda non era collegata a PHP, la tua risposta basata su PHP mi ha indicato la giusta direzione per risolvere il mio problema con l'invio di un token di portatore. Grazie. Ho indicato la mia ragione qui solo nel vano tentativo di far apparire questa domanda nelle future ricerche di Google per sviluppatori php con un problema simile.
Chris,

49

L'unico modo in cui sono riuscito a vedere le mie intestazioni in uscita (arricciatura con php) era usare le seguenti opzioni:

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

Ottenere le informazioni di debug:

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

1
Per me quella sembrava essere l'intestazione della risposta, non l'intestazione in uscita.
Toby,

3
var_dump $datarestituirà le intestazioni di risposta e il corpo della risposta. Var_dump curl_getinfo($ch)ti fornirà le intestazioni della richiesta.
Jrgns,

2
CURLOPT_HEADERè l'intestazione della risposta - CURLINFO_HEADER_OUTè l'intestazione della richiesta. Questo è ciò che l'OP chiede :)
Richard Parnaby-King,

44

L' --trace-asciiopzione di arricciatura mostrerà le intestazioni della richiesta, nonché le intestazioni di risposta e il corpo della risposta.

Ad esempio, il comando

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

produce un file curl.traceche inizia come segue:

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

Ha anche ottenuto una risposta (una risposta 302, per essere precisi ma irrilevante) che è stata registrata.


Se desideri solo salvare le intestazioni di risposta , utilizza l' --dump-headeropzione:

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

Se hai bisogno di maggiori informazioni sulle opzioni disponibili, usa curl --help | less(produce un paio di centinaia di righe di output ma menziona molte opzioni). Oppure trova la pagina di manuale in cui sono disponibili ulteriori spiegazioni sul significato delle opzioni.


10
-D ti dà le intestazioni di risposta (come fa -I, ma a STDIN). La domanda ha richiesto le intestazioni della richiesta .
pr1001,

34

curl --trace-ascii {nomefile} o usa un singolo trattino invece del nome del file per farlo inviare a stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION se stai usando libcurl

Questo ti mostra tutto ciò che l' arricciatura invia e riceve, con alcune informazioni extra gettate dentro.


1
Questo è molto dettagliato, ma certamente ti mostra tutto ciò che dovresti sapere.
Tripleee,

27

Ho provato le risposte qui e ho scoperto che la più utile e semplice non è ancora elencata come risposta, ma è:

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

Ciò stampa le intestazioni RICHIESTA nonché le intestazioni RESPONSE oltre ad altri utili come il certificato SSL e se una connessione TCP esistente è stata riutilizzata. il -vflag può essere combinato con altri flag, ovviamente, ad esempio per seguire i reindirizzamenti e richiedere l'autenticazione HTTP:

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

Spero che sia di aiuto.


2
È elencato nella posizione più alta
Pmpr

19

Un comando come quello sotto mostrerà tre sezioni: intestazioni di richiesta, intestazioni di risposta e dati (separati da CRLF). Evita le informazioni tecniche e il rumore sintattico aggiunto dall'arricciatura.

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

Il comando produrrà il seguente output:

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>

Descrizione:

  • -vs - aggiungi le intestazioni (-v) ma rimuove la barra di avanzamento (-s)
  • 2>&1 - combina stdout e stderr in singolo stdout
  • sed - modifica la risposta prodotta dall'arricciatura usando i comandi seguenti
  • /^* /d - rimuovi le righe che iniziano con '*' (informazioni tecniche)
  • /bytes data]$/d - rimuove le righe che terminano con "dati byte]" (informazioni tecniche)
  • s/> // - rimuovi il prefisso '>'
  • s/< // - rimuovi il prefisso '<'

11

So che è un po 'tardi, ma il mio metodo preferito per farlo è netcat, dato che ottieni esattamente ciò che ti è stato curlinviato; questo può differire dalle opzioni --traceo --trace-asciiche non mostreranno correttamente i caratteri non ASCII (mostrano solo punti o devono essere decodificati).

Puoi farlo molto facilmente aprendo due finestre di terminale, nel primo tipo:

nc -l localhost 12345

Questo apre un processo di ascolto sulla porta 12345 del tuo computer locale.

Nella seconda finestra del terminale immettere il comando arricciatura, ad esempio:

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

Nella prima finestra del terminale vedrai esattamente ciò che l'arricciatura ha inviato nella richiesta.

Ora ovviamente ncnon invierà nulla in risposta (a meno che non lo digiti in te stesso), quindi dovrai interrompere il comando curl (control-c) e ripetere il processo per ogni test.

Tuttavia, questa è un'opzione utile per il semplice debug della tua richiesta, poiché non stai coinvolgendo un round trip da nessuna parte, o producendo false richieste iterative da qualche parte fino a quando non hai capito bene; una volta che sei soddisfatto del comando, reindirizzalo semplicemente a un URL valido e sei a posto.

Puoi fare lo stesso anche per qualsiasi libreria cURL, modifica semplicemente la tua richiesta per puntare ncall'ascoltatore locale fino a quando non sei soddisfatto.


6

scaricare le intestazioni in un file e il payload della risposta in un altro file

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

È inoltre -Ipossibile utilizzare l' opzione se si desidera inviare una richiesta HEAD e non una richiesta GET.


3

Ecco il mio client http in php per fare domande post con i cookie inclusi:

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

Puoi vederlo usando -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

Puoi usare WireShark o TCXDump per esaminare qualsiasi traffico di rete (anche http).


11
se il payload è su HTTPS, questi sono inutili senza un proxy o un monitor a livello di applicazione.
p00ya,

1

Invia una richiesta di esempio a https://http-tools.appspot.com/reflect-http-request/some-unique-id e controlla cosa contiene questa richiesta (intestazione della richiesta, corpo della richiesta, parametri della richiesta) dal corrispondente URL di ricerca https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Puoi usare qualsiasi stringa invece di some-unique-id, controlla https://http-tools.appspot.com per maggiori dettagli.


1
Grazie, pur non rispondendo esattamente alla domanda, questo è esattamente ciò di cui avevo bisogno. Il dispositivo A invia una richiesta, il dispositivo B verifica che sia stata effettuata una richiesta.
domen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.