¿Cómo puedo ver los encabezados de solicitud realizados por curl al enviar una solicitud al servidor?

Respuestas:

501

Creo que curl -ves lo más fácil. Escupirá los encabezados de solicitud (líneas con el prefijo '>') sin tener que escribir en un archivo:

$ 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
fuente
58
curl -v -D - stackoverflow.com -o / dev / null (para no mostrar todo el contenido del sitio, solo encabezados)
omnomnom
20
curl -Ivs http://example.com > /dev/null: -Ipara una HEADsolicitud, -vpara mostrar encabezados enviados, -spara ocultar la barra de progreso, > /dev/nullpara mostrar solo la salida -v, evitando la duplicación.
aquí
@PiotrekDe -D -estaba ordenado, pero no fue útil para mí, ya que simplemente duplicaba los encabezados que -vya se mostraban. Si desea que no estén prefijados para el consumo automático de la máquina, tal vez sería mejor en ese caso, pero solo quería vislumbrar cuál era el problema con más detalle.
Pisis
1
Hay dos características muy útiles del indicador "detallado": primero, también imprime el proceso de enlace TLS cuando se accede al sitio web a través de HTTPS, como curl -v https://www.example.com; segundo, también imprime la CONNECTsolicitud si está visitando el sitio a través del proxy HTTP , como curl --proxy my-proxy:8080 http://www.example.com. Creo que ayudaría a más usuarios si se mencionan algunos ejemplos de estas dos características en esta respuesta.
Franklin Yu
1
TL; DR: No usar-I En el mundo moderno, cuando las personas preguntan sobre ver encabezados, probablemente estén hablando de API. Y si usa esa -Imentalidad de "Yo uso para ver los encabezados con mi servidor web Apache", perderá mucho tiempo desarrollando un HEADmétodo que probablemente quiera usar GET. Deja de decirle a la gente que use -I. Si lo desean HEAD, use -X HEAD(TWSS)
Bruno Bronosky
141

La pregunta no especificaba si el comando de línea de comando nombrado curlera la biblioteca completa de cURL.

El siguiente código PHP que usa la biblioteca cURL usa el primer parámetro como método HTTP (por ejemplo, "GET", "POST", "OPTIONS") y el segundo parámetro como 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;

Ejemplo de uso:

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

Tenga en cuenta que los resultados son casi idénticos a la siguiente línea de comando

curl -v -s -o - -X OPTIONS https://google.com
Tash Pemhiwa
fuente
Esta es la mejor respuesta, porque el archivo utilizado en este método contiene todo en curl_getinfo () al que se hace referencia a continuación, junto con más detalles sobre la solicitud y la respuesta.
Mike_K
3
Puede usar CURLOPT_WRITEHEADER para la información del encabezado y CURLOPT_FILE para toda la transferencia
sturrockad
1
Tenga en cuenta que si se rechaza la conexión, los archivos que se especificaron con CURLOPT_WRITEHEADER y CURLOPT_FILEestán vacíos.
Eithed
34
¿Quién dijo algo sobre el uso?php?
Eddie B
1
He votado tu respuesta porque, aunque la pregunta no estaba relacionada con php, tu respuesta basada en php me indicó la dirección correcta para resolver mi propio problema al enviar un token de portador. Gracias. Dije mi razón aquí solo en el vano intento de que esta pregunta aparezca en futuras búsquedas de google para desarrolladores de php con un problema similar.
Chris
49

La única forma en que pude ver mis encabezados salientes (curl con php) fue usando las siguientes opciones:

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

Obteniendo su información de depuración:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
Kniganapolke
fuente
1
Para mí, ese parecía ser el encabezado de respuesta, no el encabezado saliente.
Toby
3
var_dump $datadevolverá los encabezados de respuesta, así como el cuerpo de respuesta. Var_dump curl_getinfo($ch)le dará los encabezados de solicitud.
Jrgns
2
CURLOPT_HEADERes el encabezado de respuesta: CURLINFO_HEADER_OUTes el encabezado de la solicitud. Esto es lo que el OP está pidiendo :)
Richard Parnaby-King
44

La --trace-asciiopción de curl mostrará los encabezados de solicitud, así como los encabezados de respuesta y el cuerpo de respuesta.

Por ejemplo, el comando

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

produce un archivo curl.traceque comienza de la siguiente manera:

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

También recibió una respuesta (una respuesta 302, para ser precisos pero irrelevantes) que se registró.


Si solo desea guardar los encabezados de respuesta , use la --dump-headeropción:

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

Si necesita más información sobre las opciones disponibles, úsela curl --help | less(produce unas doscientas líneas de salida pero menciona muchas opciones). O busque la página del manual donde hay más explicaciones de lo que significan las opciones.

Jonathan Leffler
fuente
10
-D le da los encabezados de respuesta (como lo hace -I, pero a STDIN). La pregunta solicitó los encabezados de solicitud .
pr1001
34

curl --trace-ascii {filename} o use un solo guión en lugar del nombre del archivo para enviarlo a stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION si estás usando libcurl

Esto muestra todo lo que curl envía y recibe, con información adicional incluida.

Daniel Stenberg
fuente
1
Esto es muy detallado, pero ciertamente te muestra todo lo que debes saber.
tripleee
27

Intenté las respuestas aquí y descubrí que la más útil y fácil aún no figura como respuesta, pero es:

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

Esto imprime los encabezados de SOLICITUD , así como los encabezados de RESPUESTA, además de otros útiles, como el certificado SSL y si se reutilizó una conexión TCP existente. la -vbandera se puede combinar con otras banderas, por supuesto, como seguir redirecciones y solicitar autenticación HTTP:

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

Espero que esto ayude.

GregT
fuente
2
Está en la lista en el lugar más alto
Pmpr
19

Un comando como el siguiente mostrará tres secciones: encabezados de solicitud, encabezados de respuesta y datos (separados por CRLF). Evita la información técnica y el ruido sintáctico agregado por curl.

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

El comando producirá el siguiente resultado:

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>

Descripción:

  • -vs - agregue encabezados (-v) pero elimine la barra de progreso (-s)
  • 2>&1 - combina stdout y stderr en stdout simple
  • sed - Edite la respuesta producida por curl utilizando los siguientes comandos
  • /^* /d - eliminar líneas que comienzan con '*' (información técnica)
  • /bytes data]$/d - eliminar líneas que terminan con 'datos de bytes]' (información técnica)
  • s/> // - eliminar el prefijo '>'
  • s/< // - eliminar el prefijo '<'
igorpcholkin
fuente
11

Sé que es un poco tarde, pero mi método preferido para hacerlo es netcat, ya que obtienes exactamente lo que curlenviaste; esto puede diferir de las opciones --traceu --trace-asciique no mostrarán caracteres que no sean ASCII correctamente (solo se muestran como puntos o necesitan ser decodificados).

Puede hacer esto tan fácilmente abriendo dos ventanas de terminal, en el primer tipo:

nc -l localhost 12345

Esto abre un proceso de escucha en el puerto 12345 de su máquina local.

En la segunda ventana de terminal, ingrese su comando curl, por ejemplo:

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

En la primera ventana de terminal verá exactamente qué rizo se envió en la solicitud.

Ahora, por supuesto nc, no enviará nada en respuesta (a menos que lo escriba usted mismo), por lo que deberá interrumpir el comando curl (control-c) y repetir el proceso para cada prueba.

Sin embargo, esta es una opción útil para simplemente depurar su solicitud, ya que no está involucrando un viaje de ida y vuelta a ninguna parte, o produciendo solicitudes falsas e iterativas en algún lugar hasta que lo haga correctamente; una vez que estés satisfecho con el comando, simplemente redirígelo a una URL válida y listo.

También puede hacer lo mismo para cualquier biblioteca de cURL, simplemente edite su solicitud para señalar al ncoyente local hasta que esté satisfecho con ella.

Haravikk
fuente
6

volcar los encabezados en un archivo y la carga útil de la respuesta en un archivo diferente

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
Barry Knapp
fuente
5
curl -s -v -o / dev / null -H "Testheader: test" http://www.example.com

También puede usar la -Iopción si desea enviar una solicitud HEAD y no una solicitud GET.

juancholas
fuente
3

Aquí está mi cliente http en php para hacer consultas posteriores con cookies incluidas:

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 $ respuesta; 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
fuente
3

Puedes verlo 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
Ekatandilburg
fuente
1

Puede usar wireshark o tcpdump para buscar en cualquier tráfico de red (http también).

Paweł Polewicz
fuente
11
si la carga útil es superior a HTTPS, esas son inútiles sin un proxy o un monitor de capa de aplicación.
p00ya el
1

Realice una solicitud de muestra a https://http-tools.appspot.com/reflect-http-request/some-unique-id y verifique qué contiene esta solicitud (encabezado de solicitud, cuerpo de solicitud, parámetros de solicitud) por su correspondiente URL de buscador https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Puede usar cualquier cadena en lugar de some-unique-id, consulte https://http-tools.appspot.com para obtener más detalles.

Visruth
fuente
1
Gracias, aunque no respondí exactamente la pregunta, esto es exactamente lo que necesitaba. El dispositivo A realiza una solicitud, el dispositivo B comprueba que se haya realizado una solicitud.
domen